“强制”符合通用约束

时间:2012-01-28 09:01:03

标签: 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() { }
}

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

1 个答案:

答案 0 :(得分:5)

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

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

如果需要考虑性能,可能有一些优化方法 - 例如通过表达式树构建工厂代理,以及缓存它们。如果性能不是问题,那将会有很多麻烦:)