如果一个类实现某个接口,如何在运行时检查?

时间:2010-04-19 10:06:53

标签: asp.net-mvc interface abstraction

假设我有一些内容类,如Page,TabGroup,Tab等。 其中一些将实现我的IWidgetContainer接口 - 这意味着他们将从界面中设置一个名为ContainedItems的附加字段以及一些操作该字段的方法。

现在我需要反映一些类通过在我的ASP.NET MVC视图中呈现一些特殊的自定义控件(如jQuery添加/删除/移动/重新排序按钮)来实现此接口的事实。

例如,TabGroup将实现IWidgetContainer,因为它将包含选项卡,但选项卡不会实现它,因为它不能包含任何内容。

所以我必须以某种方式检查我的视图,当我渲染我的内容对象时(问题是,我在我的视图中使用我的基类作为强类型而不是具体的类),是否它实现了IWidgetContainer。

这怎么可能或者我完全错过了什么?

要重新解释这个问题,您如何在UI中反映类的某些特殊属性(如接口实现)(不一定是ASP.NET MVC)?

到目前为止,这是我的代码:

[DataContract]
public class ContentClass
{
    [DataMember]
    public string Slug;

    [DataMember]
    public string Title;

    [DataMember]
    protected ContentType Type;
}

[DataContract]
public class Group : ContentClass, IWidgetContainer
{
    public Group()
    {
        Type = ContentType.TabGroup;
    }

    public ContentList ContainedItems
    {
        get; set;
    }

    public void AddContent(ContentListItem toAdd)
    {
        throw new NotImplementedException();
    }

    public void RemoveContent(ContentListItem toRemove)
    {
        throw new NotImplementedException();
    }
}

[DataContract]
public class GroupElement : ContentClass
{
    public GroupElement()
    {
        Type = ContentType.Tab;
    }
}

接口:

interface IWidgetContainer
{
    [DataMember]
    ContentList ContainedItems { get; set; }

    void AddContent(ContentListItem toAdd);
    void RemoveContent(ContentListItem toRemove);

}

3 个答案:

答案 0 :(得分:3)

我认为你在寻找

 void Foo(ContentClass cc)
 {
    if (cc is IWidgetContainer) 
    {
        IWidgetContainer iw = (IWidgetContainer)cc;
        // use iw
    }

 }

答案 1 :(得分:2)

我可能误解了您的问题,但使用is关键字时出现问题?

<% if (obj is IWidgetContainer) { %>
    <!-- Do something to render container-specific elements -->
<% } %>

答案 2 :(得分:0)

您可以在运行时检查类/接口是否来自另一个类/接口,如此

public static class ObjectTools
{
        public static bool Implements(Type sourceType, Type implementedType)
        {
            if(implementedType.IsAssignableFrom(sourceType))
            {
                return true;
            }
            return false;
        }
}

您需要做的就是将您正在检查的类型输入到sourceType参数(X)中,并将您要测试的类型输入到implementsType参数(Y)中,如下所示

Console.WriteLine(ObjectTools.Implements(typeof(X), typeof(Y)));