C# &引用;强迫;符合一般约束
我有一个类,C# &引用;强迫;符合一般约束,c#,generics,constraints,C#,Generics,Constraints,我有一个类,Target,它带有一个泛型约束,不能更改。我希望可能从一个没有约束的泛型类构建该类的实例。下面演示了我想做的事情的意图,但我意识到这段代码不会编译,而且typeof(T).IsClass是一个运行时检查,而通用约束是编译时关注点 public class TargetMaker<T> { public object GetTarget() { if (typeof(T).IsClass) { ret
Target
,它带有一个泛型约束,不能更改。我希望可能从一个没有约束的泛型类构建该类的实例。下面演示了我想做的事情的意图,但我意识到这段代码不会编译,而且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
{
公共对象GetTarget()
{
if(类型(T).IsClass)
{
返回新目标();
}
返回默认值(T);
}
}
公共类目标,其中T:class
{
公共目标(){}
}
有人能想出一种方法,在不添加匹配约束的情况下,在TargetMaker类中实现我想要的目标,同时将所有逻辑保留在TargetMaker类中吗?您介意使用反射吗?如果没有:
if (typeof(T).IsClass)
{
Type targetType = typeof(Target<>).MakeGenericType(typeof(T));
return Activator.CreateInstance(targetType);
}
...
if(typeof(T).IsClass)
{
Type targetType=typeof(Target).MakeGenericType(typeof(T));
返回Activator.CreateInstance(targetType);
}
...
如果性能是一个问题,可能有一些方法可以对其进行优化,例如通过表达式树构建工厂委托,并缓存它们。如果性能不成问题,这将是一个很大的麻烦:)好主意
typeof(T).IsClass
已经是反射-它比新代码快得多吗?@Kobi:typeof(T).IsClass
与Activator.CreateInstance
调用相比将非常快。(至少,这是我所期望的。如果我真的在乎,我当然会测试:)你添加的两行。他已经有了typeof(T).IsClass
。无论如何,好答案,让我们不要停留在这个:)
。谢谢