我構建了一個 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出于相同目的使用約束,但是我無法將其應用于我的示例......
uj5u.com熱心網友回復:
如果它有一個默認的建構式,添加新的約束,并且new它
新約束指定泛型類宣告中的型別引數必須具有公共無引數建構式。要使用新約束,型別不能是抽象的。
例子
public abstract class XmlParser<TProduct>
where TProduct : ProductBase, new()
...
public List<TProduct>Parse()
{
var product = new TProduct();
...
uj5u.com熱心網友回復:
如果它沒有new()約束,您可以使用以下內容:
Activator.CreateInstance<T>();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/326513.html
上一篇:如何使用image-js和JavaScript規范化影像(直方圖拉伸)?
下一篇:Nestjs覆寫基本服務方法
