“强制”符合通用约束
问题描述:
我有一个类,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);
}
...
如果性能是一个问题,有可能是优化它的方法 - 比如通过表达式树建设工厂的代表,和他们缓存。这将是很多麻烦,如果性能不是一个问题虽然:)
好主意。 'typeof(T).IsClass'已经是反射 - 它比新代码快得多吗? – Kobi 2012-01-28 09:13:20
这是*完美* - 谢谢! (在允许时会复选框) – 2012-01-28 09:14:11
@Kobi:与'Activator.CreateInstance'调用相比,'typeof(T).IsClass'会很快。 (至少,这是我的期望,如果我真的关心,我当然会测试:) – 2012-01-28 09:14:44