【问题标题】:Call constructor in abstract class with generics使用泛型调用抽象类中的构造函数
【发布时间】:2014-12-28 15:39:07
【问题描述】:

我有以下抽象基类:

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);
    }
    ...
}

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

【问题讨论】:

    标签: c# generics


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      第一个是最干净的。这样,您的类就可以作为自己的工厂。

      【讨论】:

        猜你喜欢
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多