当前位置 : 主页 > 编程语言 > c语言 >

强类型属性引用多个类,没有通用接口(C#)

来源:互联网 收集:自由互联 发布时间:2021-06-25
System. Windows.Documents命名空间包含许多具有InlineCollection类型的Inlines属性的类.例如,Paragraph,Bold和Hyperlink类都具有此属性. 这些类中的每一个都使用ContentPropertyAttribute进行修饰…… [Content
System. Windows.Documents命名空间包含许多具有InlineCollection类型的Inlines属性的类.例如,Paragraph,Bold和Hyperlink类都具有此属性.

这些类中的每一个都使用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;
    }
}
网友评论