"强制"符合通用约束

Eri*_*ich 3 c# generics constraints

我有一个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() { }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以想到一种方法,我可以在TargetMaker中实现我想要的,而不需要为其添加匹配约束,同时保留TargetMaker类中的所有逻辑?

Jon*_*eet 5

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

if (typeof(T).IsClass)
{
    Type targetType = typeof(Target<>).MakeGenericType(typeof(T));
    return Activator.CreateInstance(targetType);
}
...
Run Code Online (Sandbox Code Playgroud)

如果性能是一个问题,可能有一些方法可以优化它 - 例如通过表达式树构建工厂代理,以及缓存它们.如果性能不是问题,这将是很麻烦:)