[英]Call constructor in abstract class with generics
我有以下抽象的基類:
public abstract class MasterDataViewModel<TPrimaryModel> : ViewModel
where TPrimaryModel : TwoNames, new()
{
...
}
我有一些派生類,如:
public class ConsignorViewModel : MasterDataViewModel<Consignor>
{
protected override void Find()
{
...
foreach (Consignor consignor in consignors)
{
ConsignorViewModel viewModel = new ConsignorViewModel(consignor, consignor.Address);
SearchResults.Add(viewModel);
}
...
}
}
我想將Find方法移至我的基類。 問題是構造函數調用,這在我的抽象類中是不可能的。 它必須是這樣的:
protected override void Find()
{
...
foreach (TPrimaryModel primaryModel in results)
{
MasterDataViewModel<TPrimaryModel> viewModel = new MasterDataViewModel(primaryModel, primaryModel.Address);
SearchResults.Add(viewModel);
}
...
}
它不起作用,因為不允許在抽象類中進行構造函數調用。 還有其他解決方案嗎? 我想到了另一個通用名稱。 問題是新約束不能有任何參數,因此也不起作用。
類的這種設計不健全是正確的,如果Find()
里面方法MasterDataViewModel
/ ConsignorViewModel
類是創建類的實例。 似乎Find()
方法應該是一個靜態幫助器類,但是我們看不到Find()
方法的所有代碼,因此我不能肯定地說。 如果不是靜態方法,則應將Find()
功能移到另一個幫助程序類。
在每個模型中都覆蓋的基類“ CreateViewModel”中創建一個抽象方法。 或使用Activator.CreateInstance方法創建this.GetType()子類的實例。
第一個是最干凈的。 這樣,您的班級將為自己服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.