加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:36:55 所属栏目:百科 来源:网络整理
导读:System. Windows.Documents命名空间包含许多具有InlineCollection类型的Inlines属性的类.例如,Paragraph,Bold和Hyperlink类都具有此属性. 这些类中的每一个都使用ContentPropertyAttribute进行修饰…… [ContentPropertyAttribute("Inlines")]public class P
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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读