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
。无论如何,好答案,让我们不要停留在这个
:)
。谢谢