“强制”符合通用约束

问题描述:

我有一个类,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类?

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

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