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);
答案 0 :(得分:2)
最简单的测试和演员。
if (inl1 is Run)
p.Inlines.Add((Run)inl1);
else if (inl1 is Span)
p.Inlines.Add((Span)inl1);
修改强>
我想我理解你的思考过程。如果您的对象被转换为内联并不重要。它的基础类型仍然是你所期望的。这是为了编译器的好处,知道代表您调用哪些方法。使用XamlReader.Parse()
时,它会将适当输入的项目作为object
引用返回。您要添加的InlineCollection
不期望object
,这就是失败的原因。由于类型实际上是Run
或Span
,它们都继承自Inline
(集合所期望的),因此您需要使用适当类型的变量。
考虑到你的心态,我认为你的功能可以简化为:
void Function(Inline inline)
{
p.Inlines.Add(inline);
}
答案 1 :(得分: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);
}