用泛型调用抽象类中的构造函数

时间:2014-12-28 15:39:08

标签: c# 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);
    }
    ...
}

它不起作用,因为不允许在抽象类中使用构造函数调用。还有其他方法吗?我想到了另一个通用。问题是新约束不能有任何参数,所以这也不起作用。

2 个答案:

答案 0 :(得分:2)

如果Find() / MasterDataViewModel类中的ConsignorViewModel方法正在创建类的实例,那么这种类设计听起来并不合适。这似乎是Find()方法应该是一个静态助手类,但我们没有看到Find()方法的所有代码,所以我不能肯定地说出来。如果不是静态方法,则应将Find()功能移出到另一个辅助类。

答案 1 :(得分:0)

在基类中创建一个抽象方法&#34; CreateViewModel&#34;您在每个模型中覆盖。或者使用Activator.CreateInstance方法创建this.GetType()子类的实例。

第一个是最干净的。这样你的班级就可以作为自己的工厂。