簡體   English   中英

枚舉類型的接口時,如何僅獲得那些直接繼承的接口?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM