1
例如,考慮在運行時下面的代碼片段如何異常實例獲取代碼來實現合同
Contract.Requires<CustomException>(arg !=null)
,下面的代碼會拋出CustomException
類型除外。代碼合同是否使用Activator來創建CustomException
的實例,或者我們如何使用它。我想在我的代碼中實現一個類似的另一個目的。
例如,考慮在運行時下面的代碼片段如何異常實例獲取代碼來實現合同
Contract.Requires<CustomException>(arg !=null)
,下面的代碼會拋出CustomException
類型除外。代碼合同是否使用Activator來創建CustomException
的實例,或者我們如何使用它。我想在我的代碼中實現一個類似的另一個目的。
根據Microsoft Reference Source,你參考的方法來實現這樣的:
public static void Requires<TException>(bool condition) where TException : Exception
{
AssertMustUseRewriter(ContractFailureKind.Precondition, "Requires<TException>");
}
正如你可以看到,沒有任何功能結合到通用TException
類型參數。這是因爲編譯後ccrewrite.exe
會處理這個問題。在你的泛型類型參數
首先,用new()
約束:
關於你的第二個問題,你總是可以創建一個給定類型的實例有兩種不同的方式
public static void CreateInstance<TClass>() where TClass : new()
{
TClass instance = new TClass();
// ...
}
其次,通過使用反射Activator
:如果例如
public static void CreateInstanceWithReflection<TClass>()
{
TClass instance = Activator.CreateInstance<TClass>();
// ...
}
後者方法是有用不知道真正的類型,並希望首先通過反射進行搜索。請注意,通過反射來創建一個實例也需要你的類提供一個無參數的構造函數。如果沒有,請參考question尋求建議。