2016-07-16 49 views
1

例如,考慮在運行時下面的代碼片段如何異常實例獲取代碼來實現合同

Contract.Requires<CustomException>(arg !=null) 

,下面的代碼會拋出CustomException類型除外。代碼合同是否使用Activator來創建CustomException的實例,或者我們如何使用它。我想在我的代碼中實現一個類似的另一個目的。

回答

0

根據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尋求建議。