System. Windows.Documents命名空间包含许多具有InlineCollection类型的Inlines属性的类.例如,Paragraph,Bold和Hyperlink类都具有此属性. 这些类中的每一个都使用ContentPropertyAttribute进行修饰…… [Content
这些类中的每一个都使用ContentPropertyAttribute进行修饰……
[ContentPropertyAttribute("Inlines")] public class Paragraph : Block
…这意味着使用反射很容易检测给定对象是否暴露了这个属性.
但是,我需要能够以强类型的方式在实现它的所选类型中访问此属性.
我有点惊讶的是,微软没有让所有这些类实现一个“IInlineContainer”接口,这样就可以很容易地进行类型检查和转换.
但是,在没有这样的接口的情况下,有没有办法伪造这种多态功能,理想情况下不会乱丢我的代码有很多条件和类型检查?
非常感谢你的想法,
蒂姆
编辑:
谢谢你的建议.很多人都提出了包装类的想法,但在我的情况下这是不可能的,因为目标对象不是由我的代码创建的,而是由.NET框架中的其他类创建的,例如Xaml解析器或RichTextBox控件(正在编辑包含FlowDocument的控件).
编辑2:
这里有几个很棒的建议,我感谢所有分享他们想法的人.我选择实施的解决方案采用了@qstarin建议的扩展方法,尽管我已经根据我的需求改进了这个概念,如下所示:
public static InlineCollection GetInlines( this FrameworkContentElement element) { if (element == null) throw new ArgumentNullException("element"); if (element is Paragraph) { return ((Paragraph) element).Inlines; } else if (element is Span) // also catches Bold, Italic, Unerline, Hyperlink { return ((Span)element).Inlines; } else { return null; } }
虽然这种方法需要条件逻辑和类型转换(我说我想避免),扩展方法的使用意味着它只需要在一个地方实现,让我的各种调用方法整洁.
扩展方法.public static class InlineContainerExtensions { public static InlineContainer GetInlines(this Paragraph inlineContainer) { return inlineContainer.Inlines; } public static InlineContainer GetInlines(this Bold inlineContainer) { return inlineContainer.Inlines; } }