2010-04-19 115 views
1

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

接口:

​​

回答

3

我認爲你正在尋找

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

} 
2

我可能誤解了你的問題,但有使用的is關鍵字的問題嗎?

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

號,用 「是」 沒有問題的。我忘了也可以使用「is」。 ;) – mare 2010-04-19 10:30:06

0

您可以在運行時檢查類/接口從另一個類/接口得出的,像這樣

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

所有你需要做的是輸入您正在檢查的類型到sourceType參數(X)中,並將您正在測試的類型輸入ImpletedType參數(Y),如下所示:

Console.WriteLine(ObjectTools.Implements(typeof(X), typeof(Y))); 
相關問題