使用来自泛型类型 base class 的参数化构造函数
Using parameterized constructor from generic types base class
我有一个抽象的基础-class和几个从中派生出来的classes。 base-class 有一些违背所有惯例的构造函数,我很乐意使用它们。
我现在正在编写一个扩展方法,它采用泛型类型参数。此类型为 return 类型:
public static T Create<T>(string key) where T : Baseclass { }
现在,我想访问 Baseclass' 构造函数,例如:
var item = new T(key);
其中base-class定义了对应的构造函数
我知道,这可能是一个非常糟糕的设计,并且有使用反射(天真的方式)或委托函数或将构造函数调用放在 Create() 调用之外的变通方法。
我很好奇为什么 C#-Compiler 不允许访问在抽象基 class 中定义的泛型的构造函数,泛型必须从抽象基派生,因为通用类型约束。
有几个问题,几乎相似,但它们都关心约束构造函数的泛型类型,在我的例子中,约束是 class-继承。
嗯,首先你错过了 new()
约束,它允许构造一个通用类型,即
public static T Create<T>(string key) where T : Baseclass, new()
{
...
}
但是,鉴于您需要将参数传递给构造函数,这只会导致替换 another 的一个错误。解决此问题的一种方法是避免构造函数注入(如果可能)并转而进行参数注入
var item = new T();
item.Key = key;
如果必须构造函数注入,那么正如你提到的,你几乎只能使用反射。
我有一个抽象的基础-class和几个从中派生出来的classes。 base-class 有一些违背所有惯例的构造函数,我很乐意使用它们。 我现在正在编写一个扩展方法,它采用泛型类型参数。此类型为 return 类型:
public static T Create<T>(string key) where T : Baseclass { }
现在,我想访问 Baseclass' 构造函数,例如:
var item = new T(key);
其中base-class定义了对应的构造函数
我知道,这可能是一个非常糟糕的设计,并且有使用反射(天真的方式)或委托函数或将构造函数调用放在 Create() 调用之外的变通方法。
我很好奇为什么 C#-Compiler 不允许访问在抽象基 class 中定义的泛型的构造函数,泛型必须从抽象基派生,因为通用类型约束。
有几个问题,几乎相似,但它们都关心约束构造函数的泛型类型,在我的例子中,约束是 class-继承。
嗯,首先你错过了 new()
约束,它允许构造一个通用类型,即
public static T Create<T>(string key) where T : Baseclass, new()
{
...
}
但是,鉴于您需要将参数传递给构造函数,这只会导致替换 another 的一个错误。解决此问题的一种方法是避免构造函数注入(如果可能)并转而进行参数注入
var item = new T();
item.Key = key;
如果必须构造函数注入,那么正如你提到的,你几乎只能使用反射。