";强制“;符合通用约束

本文关键字:约束 quot 强制 | 更新日期: 2023-09-27 18:21:36

我有一个类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);
}
...

如果性能是一个问题,那么可能有一些方法可以优化它,比如通过表达式树构建工厂委托,并缓存它们。如果性能不是问题,那将是一个很大的麻烦:)