![](/img/trans.png)
[英]How do I know when an interface is directly implemented in a type ignoring inherited ones?
[英]When enumerating a type's interfaces how do I get only those that are directly inherited?
我不確定這里的確切術語。 基本上,如果我有一個像這樣的模型:
class Student : IDoSchool {}
class Freshman : Student {}
interface IDoSchool {}
什么代碼可以告訴我Freshman不直接實現任何接口,而Student直接實現IDoSchool?
換句話說(不考慮不良術語),我想要這樣的東西:
typeof(Freshman).GetInterfaces(BindingFlags.DeclaredOnly); // nothing
typeof(Student).GetInterfaces(BindingFlags.DeclaredOnly); // IDoSchool
思考?
我懷疑接口的語義與您要執行的操作不一致。
一個接口只是說一個類必須隱含一個成員列表。 該類繼承了接口,但是實現從父類繼承的接口仍然是子類的責任。 在大多數情況下,父級已經提供了一個實現,因此我們傾向於認為接口實現與繼承相同,但實際上它們是完全不同的概念。
對於您來說,最好的辦法是使用GetInterfaceMap()獲取接口映射,並確保接口的每個成員的所有實現都來自父級,而不是子級。 這是您可以做的最好的事情,但是仍然無法完全完成您想做的事情。
另外,在您的情況下,是否可以使用完全抽象的類而不是接口? 您不能進行多重繼承,但是也許所有規則都暗示着非常線性的繼承?
只是個主意...
您可以獲得類的接口和基類的接口。 然后得到差異。
編輯:
我檢查了這個想法,可以正常工作:
public static Type[] GetDirectInterfaces(Type type)
{
if (type.BaseType == null)
return type.GetInterfaces();
Type[] BaseInterfaces = type.BaseType.GetInterfaces();
Type[] ThisInferfaces = type.GetInterfaces();
return ThisInferfaces.Except(BaseInterfaces).ToArray();
}
如果接口數量巨大且執行時間至關重要,則可以創建一個單獨的帶有字典的靜態類以緩存結果。
很抱歉將其發布為答案,它實際上更多是一種思想和建議,但不適合發表評論...
如果您遇到以下情況,該怎么辦:
interface IA{
void foo();
}
class CA : IA{
public void foo(){
Console.Writeline("Class A");
}
}
class CB : CA, IA{
public new void foo(){
Console.Writeline("Class B");
}
}
我猜CB應該在“直接實現的接口”中返回IA,但是如果將CB與CA進行比較,您會發現它們實現了相同的接口,因此“差異查找”方法將行不通。
在瘋狂尋找解決方案之前,您是否嘗試過查看MSIL或從Reflector反編譯的代碼以查看這是否完全可能?
typeof("the object").GetInterfaces().Count==0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.