一千萬個為什麽

搜索

如果一個類實現某個接口,如何在運行時檢查?

假設我有一些內容類,如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);

}

最佳答案

我想你在找

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

 }

轉載註明原文: 如果一個類實現某個接口,如何在運行時檢查?