[英]How to instantiate a generic type in base class?
我构建了一个 XML 解析器,可以解析不同类型的产品。 解析器代码对所有产品类型都是通用的(它将 XML 反序列化为产品类型)
所以我创建了一个名为XmlParser
的通用基类
public abstract class XmlParser<TProduct> where TProduct : ProductBase
{
public abstract TEntity Instanciate();
private string _parserName;
public XmlParser(string parserName)
{
_parserName = parserName;
}
public List<TProduct>Parse()
{
TEntity product = Instanciate(); // <-- I need to instantiate the Generic type here
// deserialize XML into product
}
}
和一个派生类:
public class CarXmlParser : XmlParser<Car>
{
public CarXmlParser() : base("CarParse") {}
public override Car Instanciate()
{
return new Car();
}
}
Car
是产品类型,派生自ProductBase
在基类中,我需要实例化TProduct
。 我能做到这一点的唯一方法是在基类中创建一个抽象方法: public abstract TEntity Instanciate();
. 显然,孩子必须执行它。
有没有更简单的方法来实例化泛型类型? 我已经看到这个问题,他们出于相同目的使用new T
约束,但是我无法将其应用于我的示例......
如果它有一个默认的构造函数中添加新的约束,以及new
起来
新约束指定泛型类声明中的类型参数必须具有公共无参数构造函数。 要使用新约束,类型不能是抽象的。
例子
public abstract class XmlParser<TProduct>
where TProduct : ProductBase, new()
...
public List<TProduct>Parse()
{
var product = new TProduct();
...
如果它没有new()
约束,您可以使用以下内容:
Activator.CreateInstance<T>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.