使用泛型类型的参数化构造函数基类
问题描述:
我有一个抽象基类和几个派生自它的类。基地级别对所有的约定都有一些我喜欢使用的构造函数。 我正在写一个扩展方法,它采用泛型类型参数。这种类型的返回类型:使用泛型类型的参数化构造函数基类
public static T Create<T>(string key) where T : Baseclass { }
现在,我想访问基类的构造函数,例如:
var item = new T(key);
当基类定义了相应的构造函数。
我知道,它可能是一个非常糟糕的设计,并且有使用反射(天真的方式)或委托函数或将构造函数调用放在Create()之外的解决方法。
我只是好奇,为什么C#-Compiler不允许访问构造函数的抽象基类中定义的泛型类型,泛型类型必须从泛型类型约束派生出来。
有几个问题,几乎相似,但他们都关心约束泛型类型的构造函数,在我的情况下约束是类继承。
答
嗯,首先你缺少的new()
约束,它允许一个泛型类型,即
public static T Create<T>(string key) where T : Baseclass, new()
{
...
}
不过的建设,给你需要的参数传递给构造函数,只有结果更换一个错误another 。解决此问题的办法是避免构造器注入(如果可能),去参数注入,而不是
var item = new T();
item.Key = key;
如果有是构造器注入,那么如你所说,你几乎仅限于使用反射。
这就是我一直以来的观点。我知道编译器不考虑基类中的构造函数,当然还有其他方法和属性。实际上,我已经使用了一种不同的方法(我在'Create'之外调用构造函数,传递实例而不是密钥,并在不需要的情况下进行处理)。有趣的问题是:为什么C#有这样的限制?实际问题还是真正的概念问题? –
@PatrikEckebrecht实际上它不能看到* base *类的构造函数,它更多的是因为编译器不支持调用泛型,参数化构造函数。至于*为什么*,请参阅Eric Lipperts [answer](http://*.com/questions/9741211/restricting-a-generic-type-parameters-to-have-a-specific-constructor/9741812#9741812)关于这个话题。 – James
Eric Lippert在那里指出,在泛型类型参数约束中支持任何方法签名的东西是一个坏主意。这不是我要求的:我不想在约束中定义构造函数,而是在基类中定义构造函数。正如他所说的,构造函数是一种方法,为什么编译器在使用泛型类型时允许访问所有方法,而不是构造函数。根据他的回答,实际上应该可以按照我的建议调用构造函数。 –