2011-10-19 140 views
0

假設我有一個抽象基類BaseClass將實例方法的參數限制爲實例的類型

我想給它看起來像下面

public void CopyPropertiesFrom<T>(T source) where T == ThisDerivedClass : BaseClass 
{ 
    // ... 
} 

我想要的方法是通用的方法,而是被限制在最派生類的當前實例的。 (我的方法將使用反射,所以我實際上並不需要在任何子類中覆蓋CopyPropertiesFrom,但我仍然希望編譯時類型安全。)

有沒有什麼方法可以用有效的C#表示?

回答

1

不僅沒有辦法表達這一點,但編譯器無論如何都不可能執行。泛型的一點是它們可以在編譯時檢查。你會想到這個做...

BaseClass foo = new DerivedClass(); 
foo.CopyPropertiesFrom<BaseClass>(new OtherDerivedClass()); 

編譯器只知道foo作爲BaseClass - 它應該怎麼知道抱怨實際上,你應該打電話foo.CopyPropertiesFrom<DerivedClass>

您可以在方法內檢查,當然 - 但是我不知道我甚使它通用:

public void CopyPropertiesFrom(BaseClass other) 
{ 
    if (other.GetClass() != GetClass()) 
    { 
     throw new ArgumentException("..."); 
    } 
} 
1

不,沒有。你只能允許一個類和任何派生的(不相關的深度繼承)。

相關問題