2015-04-28 168 views
0

我有一个抽象基类和几个派生自它的类。基地级别对所有的约定都有一些我喜欢使用的构造函数。 我正在写一个扩展方法,它采用泛型类型参数。这种类型的返回类型:使用泛型类型的参数化构造函数基类

public static T Create<T>(string key) where T : Baseclass { } 

现在,我想访问基类的构造函数,例如:

var item = new T(key); 

当基类定义了相应的构造函数。

我知道,它可能是一个非常糟糕的设计,并且有使用反射(天真的方式)或委托函数或将构造函数调用放在Create()之外的解决方法。

我只是好奇,为什么C#-Compiler不允许访问构造函数的抽象基类中定义的泛型类型,泛型类型必须从泛型类型约束派生出来。

有几个问题,几乎相似,但他们都关心约束泛型类型的构造函数,在我的情况下约束是类继承。

回答

0

嗯,首先你缺少的new()约束,它允许一个泛型类型,即

public static T Create<T>(string key) where T : Baseclass, new() 
{ 
    ... 
} 

不过的建设,给你需要的参数传递给构造函数,只有结果更换一个错误another 。解决此问题的办法是避免构造器注入(如果可能),去参数注入,而不是

var item = new T(); 
item.Key = key; 

如果是构造器注入,那么如你所说,你几乎仅限于使用反射。

+0

这就是我一直以来的观点。我知道编译器不考虑基类中的构造函数,当然还有其他方法和属性。实际上,我已经使用了一种不同的方法(我在'Create'之外调用构造函数,传递实例而不是密钥,并在不需要的情况下进行处理)。有趣的问题是:为什么C#有这样的限制?实际问题还是真正的概念问题? –

+0

@PatrikEckebrecht实际上它不能看到* base *类的构造函数,它更多的是因为编译器不支持调用泛型,参数化构造函数。至于*为什么*,请参阅Eric Lipperts [answer](http://stackoverflow.com/questions/9741211/restricting-a-generic-type-parameters-to-have-a-specific-constructor/9741812#9741812)关于这个话题。 – James

+0

Eric Lippert在那里指出,在泛型类型参数约束中支持任何方法签名的东西是一个坏主意。这不是我要求的:我不想在约束中定义构造函数,而是在基类中定义构造函数。正如他所说的,构造函数是一种方法,为什么编译器在使用泛型类型时允许访问所有方法,而不是构造函数。根据他的回答,实际上应该可以按照我的建议调用构造函数。 –

相关问题