如何使用覆盖的方法参数进行一般操作

时间:2019-03-09 23:32:35

标签: c# generics

我需要替换229次出现的旧CSLA数据访问类,第一步是使用最少的可测试更改放置真正干净的填充代码。我快到了那里,并且尝试这样做而不必用接口来装饰所有BusinessClass子代,以强制Fetch_Data

BusinessBase继承的每个类都将通过重写实现自己的Fetch_Data。我已经完成了大部分工作,但是,您不能使用从虚拟版本中使用的类派生的参数来覆盖方法,方法签名不同,并且编译器不允许这样做。

有没有关于如何使下面的链在没有接口的情况下工作的提示,特别是如何在以下条件下通用地工作?

public class BusinessLayerBaseNoCSLA<T>
{
    public virtual void Fetch_Data(BaseParameters parameters){ throw new NotWellConfiguredException();
}

扩展BusinessLayerBase:

public class Vehicle : BusinessLayerBaseNoCSLA<Vehicle>
{
    public int VehicleId { get; set; }

    public override void Fetch_Data(GetVehicleParameters parameters)//<--This line has a red squiggly because of the signature difference, no suitable method found to override.
    {
        //I could cast like  var p = (GetVehicleParameters)BaseParameters; here but something smells bad about that  
        GetVehicleParameters p = parameters;
        ... 
        VehicleId = p.VehicleId;
    }
}

DataPortal使用static以避免更新和调用Fetch,浓缩为一行代码。

public static class DataPortal
{
    public static T FetchData<T>(object criteria) where T : BusinessLayerBaseNoCSLA<T>, new()
    {
        var result = new T();
        result.Fetch_Data((BaseParameters)criteria);
        return result;
    }
}

所需用法

var Vehicle = DataPortal.FetchData<Vehicle>(new GetVehicleParameters({ VehicleId =1 });

0 个答案:

没有答案