2011-02-16 63 views
1

問題是,Type.GetInterfaces()返回一個類實現的所有接口,這包括由繼承的基類定義/實現的所有接口。當我試圖找出一個類在本地引用/實現的接口(因此排除了在基類中引用/定義的任何接口)時,我遇到了問題。如何使用反射來確定本地類是否實現接口?

我想要做類似type.GetProperties()可以採取的BindingFlags的東西,所以下面的代碼會得到那些類型內聲明的所有公共/私有財產被引用(和所有屬性中聲明基類不包括在內)。

type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly) 

我試過以下,但它失敗,因爲「.DeclaringType」始終爲空。

foreach (var implementedInterface in type.GetInterfaces()) 
{ 
    if (implementedInterface.DeclaringType == type) 
    { 
     locallyDefinedInterfaces.Add(implementedInterface); 
    } 
} 
+1

你爲什麼要這樣做? – DJClayworth 2011-02-16 14:38:16

+0

@DJClayworth:你是否真的這麼說:「你爲什麼要這樣做,我可能會以另一種方式提出建議?」。它將幫助一些新的員工從頭開始學習.NET和OO,這樣他們就可以安全地對類進行修改,因爲知道如果類定義不會改變,那麼他們就可以從這個角度來看。我同意,斷言/測試通常是矯枉過正的,但在這個例子中,已經決定這個級別的測試至少在短期內是有益的。在大多數情況下,這些測試只需要很短的時間就可以編寫 – 2011-02-16 14:58:29

回答

2

你不能用它定義的所有接口填充集合。然後,對於每個從您的目標類派生的類開始的類,獲取類實現的所有接口,隨時從列表中刪除。重複沖洗,直到你沒有更多的基礎班。無論您的列表中是什麼,接口都只能由您的原始類實現。

注意:可能有更好的方法來做到這一點,這只是一個建議。

+1

我認爲(但我不確定)你可以在你的代碼不能處理的派生類中重新實現接口。 – CodesInChaos 2011-02-16 14:46:46

+0

@CodeInChaos:是的,這是正確的,你正在測試的類和基類可以引用相同的接口。這是一個痛苦,因爲我也在考慮類似於@ Moo-Juice建議的迴歸方法。 – 2011-02-16 15:02:12

-1

如何使用is運算符來檢查該類是否屬於該類型。 e.g


class Program 
    { 
     static void Main(string[] args) 
     { 
      MyClass c = new MyClass(); 
      MyClass1 c2 = new MyClass1(); 

      var b = c is IInterface; 
      Console.WriteLine(b); //False 
      Console.WriteLine(c2 is IInterface); //True 
      Console.ReadKey(); 
     } 
    } 

    class MyClass 
    { 

    } 
    class MyClass1 : IInterface 
    { 

    } 
    interface IInterface 
    { 

    }
0

該聲明的類型爲NULL,則可能是因爲它是空...(因爲接口沒有任何類型的內聲明的)原因。只是一個見解

相關問題