簡體   English   中英

使用泛型在抽象類中調用構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM