2012-01-19 153 views
0

我想檢查是否有一個接口,我不知道我正在以正確的方式去做。我有我要檢查對底層的接口:鑄造到繼承接口

interface IName 
{ 
    string Name {get;} 
} 

然後我有一個實現此接口的類:

class Person : IName 
{ 
    public string Name {get;} 
} 

我再有另一個接口:

interface IThing<T> 
{ 
    T Thing {get;} 
} 

我然後有另一個類實現IThing:

class Teacher : IThing<Person> 
{ 
    public Person Thing {get;} 
} 

我希望能夠做的是:

Teacher teacher = new Teacher("Math", "John"); 
if (teacher is IThing<IName>) 
{ 
    Console.WriteLine((teacher as IThing<IName>).Thing.Name); 
} 

然而,這並不工作。我很確定它不知道IThing<Person>IThing<IName>。我該如何做到這一點?我基本上有幾個類實現IThing<BaseClassThatIsIName>,所以我不想明確地轉換爲類型,而是接口。

回答

1

問題是你正在試圖看看老師是否實現了IThing<IName>接口。但它並沒有實現IThing<Person>接口,其中Person實現了IName接口。你在這裏尋找一些協方差,但你定義IThing<>接口的方式不允許。允許:

interface IThing<out T> // note the "out" in the parameter 
{ 
    T Thing { get; } 
} 

現在接口將匹配確切的參數類型或更一般的類型。你應該能夠做你想要的東西:

if (teacher is IThing<IName>) // teacher is actually a `IThing<Person>` but 
           // `Person` is an `IName` so we're good 
{ 
    Console.WriteLine((teacher as IThing<IName>).Thing.Name); 
} 
+0

這是神奇的,謝謝。這似乎是其中一個應該可能與協變,我知道是在4.0引入的事情,但我不知道。有關out的更多信息:http://msdn.microsoft.com/en-us/library/dd469487.aspx如果其他人感興趣。 – Mark

0

我相信你已經掌握了這個問題,並且我不確定只有使用「is」關鍵字才能解決問題。但是,您可以使用反射來檢查1)教師是否具有通用性,2)教師的泛型類型是IThing,3)教師的泛型類型是否有一個類型參數,以及4)第一個參數是否從IName繼承。

通過this documentation爲了讓你開始。