2012-01-28 71 views
3

我有一個類,Target<T>,不能改變,與一個通用的約束。我想從一個沒有約束的泛型類構建這個類的實例。下面演示了我想要做什麼的意圖,但是我意識到這段代碼不會編譯,並且typeof(T).IsClass是運行時檢查,通用約束是編譯期問題。「強制」符合通用約束

public class TargetMaker<T> 
{ 
    public object GetTarget() 
    { 
     if (typeof(T).IsClass) 
     { 
      return new Target<T>(); 
     } 
     return default(T); 
    } 
} 

public class Target<T> where T : class 
{ 
    public Target() { } 
} 

誰能想到一個辦法,我可以實現我想在這裏TargetMaker不添加匹配約束它,同時保持所有的邏輯在TargetMaker類?

回答

5

你介意使用反射嗎?如果不是:

if (typeof(T).IsClass) 
{ 
    Type targetType = typeof(Target<>).MakeGenericType(typeof(T)); 
    return Activator.CreateInstance(targetType); 
} 
... 

如果性能是一個問題,有可能是優化它的方法 - 比如通過表達式樹建設工廠的代表,和他們緩存。這將是很多麻煩,如果性能不是一個問題雖然:)

+0

好主意。 'typeof(T).IsClass'已經是反射 - 它比新代碼快得多嗎? – Kobi 2012-01-28 09:13:20

+0

這是*完美* - 謝謝! (在允許時會複選框) – 2012-01-28 09:14:11

+1

@Kobi:與'Activator.CreateInstance'調用相比,'typeof(T).IsClass'會很快。 (至少,這是我的期望,如果我真的關心,我當然會測試:) – 2012-01-28 09:14:44