1
我在構造函數中將對象的Type
作爲參數傳遞,但我想將此類型限制爲僅從特定接口繼承的對象。傳遞類型作爲參數,但限制爲接口
public MyClass(Type myType);
我知道我可以檢查該類型從接口繼承的方法的身體像這樣:
if(typeof(IMyInterface).IsAssignableFrom(myType))
但是是可能的參數類型約束?
我在構造函數中將對象的Type
作爲參數傳遞,但我想將此類型限制爲僅從特定接口繼承的對象。傳遞類型作爲參數,但限制爲接口
public MyClass(Type myType);
我知道我可以檢查該類型從接口繼承的方法的身體像這樣:
if(typeof(IMyInterface).IsAssignableFrom(myType))
但是是可能的參數類型約束?
爲什麼不讓你的類變得通用?在這種情況下,你可以指定你的約束,而不用擔心檢查參數。
E.g.
public class MyClass<T>
where T : IMyInterface
{
....
}
因爲你表明,檢查在運行時類型代碼,我認爲要強制在編譯時的類型約束:
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!");
}
}
你不能做到這一點在構造函數中,但你可以在類聲明中做到這一點。
在C#世界中沒有任何東西可以讓你進一步限制一個參數,而不僅僅是它的類型和繼承。當你編寫一個採用int的方法時,也不可能將該方法限制爲只接受[0,10]範圍內的數字(通過一種很好的語法)。你想要的是使用PostSharp,CodeContracts或類似的東西,當某些條件不滿足時拋出異常,例如,當給定的Type對象沒有實現某個接口時。您可以自己編寫此代碼,只需在此情況下引發ArgumentException。 – Simon