对于一般判断,它有一个更“美观”的解决方案吗?

时间:2017-01-31 12:25:14

标签: c# generics

我有以下代码可以使用,但我认为它可能不是最理想的,因为理论上编译器可以从调用子类中确定泛型类型。有没有办法重写此代码,以便我不需要提供ChildType泛型类型参数?

public abstract class Test<ChildType, T> where ChildType: Test<ChildType, T>, new()
{
    public T Field { get; set; }

    public static ChildType Get(T field) {
        return new ChildType() { Field = field };
    }
}

public class ChildTest: Test<ChildTest, string>
{
}

// Call sample
var child = ChildTest.Get("test");

1 个答案:

答案 0 :(得分:3)

答案是,Test类几乎需要指定ChildType泛型类型。你可以使用反射来获取当前类型并实例化它的实例,但通常最好避免反射。

要了解为什么单独考虑Test类,特别是这一行:

return new ChildType() { Field = field };

该行需要两条信息。首先,它需要知道ChildType的实际类型是什么。你不能硬编码,因为它当然可以变化。它需要的第二条信息是知道它可以用这种方式创建这种类型的新对象。

这两条信息都是通过泛型类型参数和通用约束提供的,这就是为什么需要它。