-1


0

オブジェクトのタイプを知り、それを引き起こすにはどうすればよいですか?
Paragraph p = new Paragraph();

void Function(var inline)
{
    var r = (inline);
    string rSer = XamlWriter.Save(r);
    var inl1 = XamlReader.Parse(rSer);
    p.Inlines.Add(inl1); // error The best overloaded method match for System.Windows.Documents.InlineCollection.Add(System.Windows.UIElement)' has some invalid arguments
}

インラインタイプはSystem.Windows.Documents.RunまたはSystem.Windows.Documents.Spanです。

インラインのタイプをどのようにして知り、それに導くのですか?

私はこのようなものが必要です:

Type t = Type.GetType(inline.GetType().ToString()); // results in t == null
p.Inlines.Add(inline as t);

2 Answer


2


テストしてキャストするのが最も簡単です。

if (inl1 is Run)
    p.Inlines.Add((Run)inl1);
else if (inl1 is Span)
    p.Inlines.Add((Span)inl1);

'' '' '

編集: +私はあなたの思考プロセスを理解していると思います。 オブジェクトがインラインにキャストされるかどうかは関係ありません。 その基礎となる型はまだあなたが期待するものです。 これは、ユーザーに代わって呼び出すメソッドを知ることがコンパイラーの利益になるためです。 `XamlReader.Parse()`を使用すると、適切に型指定されたアイテムを `object`参照として返します。 追加する「InlineCollection」は「オブジェクト」を予期していないため、失敗します。 タイプは実際には「Run」または「Span」であり、どちらも「Inline」(コレクションが予期している)から継承するため、適切に型指定された変数を使用する必要があります。

これらすべてを念頭に置いて、あなたの考え方を理解して、私はあなたの機能を単純に減らすことができると思います:

void Function(Inline inline)
{
    p.Inlines.Add(inline);
}


1


System.Windows.Documents.RunとSystem.Windows.Documents.SpanはどちらもSystem.Windows.Documents.Inlineから派生しているため、次のように簡単になります。

// untested
void Function(Inline inline1)
{
    string rSer = XamlWriter.Save(inline1);
    var inline2 = XamlReader.Parse(rSer) as Inline;
    p.Inlines.Add(inline2);
}