2013-07-17 45 views
1

我在構造函數中將對象的Type作爲參數傳遞,但我想將此類型限制爲僅從特定接口繼承的對象。傳遞類型作爲參數,但限制爲接口

public MyClass(Type myType); 

我知道我可以檢查該類型從接口繼承的方法的身體像這樣:

if(typeof(IMyInterface).IsAssignableFrom(myType)) 

但是是可能的參數類型約束?

+0

在C#世界中沒有任何東西可以讓你進一步限制一個參數,而不僅僅是它的類型和繼承。當你編寫一個採用int的方法時,也不可能將該方法限制爲只接受[0,10]範圍內的數字(通過一種很好的語法)。你想要的是使用PostSharp,CodeContracts或類似的東西,當某些條件不滿足時拋出異常,例如,當給定的Type對象沒有實現某個接口時。您可以自己編寫此代碼,只需在此情況下引發ArgumentException。 – Simon

回答

1

爲什麼不讓你的類變得通用?在這種情況下,你可以指定你的約束,而不用擔心檢查參數。

E.g.

public class MyClass<T> 
    where T : IMyInterface 
{ 
    .... 
} 
0

因爲你表明,檢查在運行時類型代碼,我認爲要強制在編譯時的類型約束:

public class MyClass<T> where T : IMyInterface { 
    public MyClass(T myArg) { 
     Type myType = typeof(T); 
     Type argType = myArg.GetType(); 
     Debug.Assert(myType == argType, "types must be the same!"); 
    } 
} 

你不能做到這一點在構造函數中,但你可以在類聲明中做到這一點。