我有一个不能改变的类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类中的所有逻辑吗?
答案 0 :(得分:5)
你介意用反射吗?如果不是:
if (typeof(T).IsClass)
{
Type targetType = typeof(Target<>).MakeGenericType(typeof(T));
return Activator.CreateInstance(targetType);
}
...
如果需要考虑性能,可能有一些优化方法 - 例如通过表达式树构建工厂代理,以及缓存它们。如果性能不是问题,那将会有很多麻烦:)