微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐