C# 继承扩展方法中的多个泛型

C# 继承扩展方法中的多个泛型,c#,generics,extension-methods,C#,Generics,Extension Methods,目标是: 在一个库(DAL)中,我有很多类。。。其中一种被称为“产品”。在第二个库(BLL)中,我有一组相应的类。。。包括它自己的“产品”类。类定义不一样。某些属性具有不同的名称(例如,ProductID与Id)。一个库中的类可能具有其他库中不存在的其他属性。有许多这样的类对。我想学习如何以最好的方式在两门课之间进行翻译 是的,我知道那是存在的。我试图学习如何使用泛型和扩展方法 我知道,对于每一对类,有四种方法需要实现: 将BLL.Product上的属性值应用于DAL.Product的方法。

目标是:

在一个库(DAL)中,我有很多类。。。其中一种被称为“产品”。在第二个库(BLL)中,我有一组相应的类。。。包括它自己的“产品”类。类定义不一样。某些属性具有不同的名称(例如,ProductID与Id)。一个库中的类可能具有其他库中不存在的其他属性。有许多这样的类对。我想学习如何以最好的方式在两门课之间进行翻译

是的,我知道那是存在的。我试图学习如何使用泛型和扩展方法


我知道,对于每一对类,有四种方法需要实现:

  • BLL.Product
    上的属性值应用于
    DAL.Product
    的方法。
    • 或者。。。优选地,是应用给定
      BLL.Product
      中的值的
      DAL.Product
      的扩展方法
  • 相同,但将值从
    DAL.Product
    应用到
    BLL.Product
  • 一种方法,它实例化一个新的
    DAL.Product
    ,然后应用给定
    BLL.Product
    的值(使用上述方法)。
    • 或者。。。更可取的是,
      BLL.Product
      的扩展方法,它返回一个新的
      DAL.Product
  • 相同,但将新的
    BLL.Product
    实例化为
    DAL.Product
    的副本
  • 没有扩展方法,我有以下工作代码:

    public abstract class Adapter<DomainType, PortalType> {
       protected abstract DomainType ToDomainType (PortalType EntityToConvert);
       protected abstract PortalType ToPortalType (DomainType EntityToConvert);
       protected abstract void ApplyValuesTo (PortalType _That, ref DomainType _This);
       protected abstract void ApplyValuesTo (DomainType _That, ref PortalType _This);
    }
    
    public class ProductAdapter : Adapter<BLL.Product, DAL.Product> {
       protected override BLL.Product ToDomainType (DAL.Product EntityToConvert) {
          BLL.Product ConvertedEntity = new BLL.Product ();
          ApplyValuesTo (EntityToConvert, ref ConvertedEntity);
          return ConvertedEntity;
       }
    
       protected override DAL.Product ToPortalType (BLL.Product EntityToConvert) {
          DAL.Product ConvertedEntity = new DAL.Product ();
          ApplyValuesTo (EntityToConvert, ref ConvertedEntity);
          return ConvertedEntity;
       }
    
       protected override void ApplyValuesTo (DAL.Product _That, ref BLL.Product _This) {
          _This.Id = _That.ProductId;
          _This.Label = _That.Label;
          // yada yada yada
       }
    
       protected override void ApplyValuesTo (BLL.Product _That, ref DAL.Product _This) {
          _This.ProductId = _That.Id;
          _This.Label = _That.Label;
          // yada yada yada
       }
    }
    
    当然有办法将其转移到基类,但是如何?(注意:我的所有类都会有类似的构造函数,尽管我还没有决定它们是否是无参数构造函数。根据库的不同,我的类可能没有一个公共的基…这要怪EntityFramework。)

    对于我的
    ApplyValuesTo
    方法,我非常不喜欢传递ref参数。我更喜欢扩展方法的语法。比如:

    public static class ProductAdapter {
       public static void GetValuesFrom (this DAL.Product _This, BLL.Product _That) {
          _This.ProductId = _That.Id;
          _This.Label = _That.Label;
          // yada yada yada
       }
    }
    
    // Usage
    DALProductInstance.GetValuesFrom (BLLProductInstance);
    
    这很好,但似乎这应该是使用泛型在抽象基类中定义的东西


    这就是我想要的。这是我天真地认为应该起作用的

    public abstract static class Adapter<DomainType, PortalType> {
       public abstract static void GetValuesFrom (this DomainType _This, PortalType _That);
       public abstract static void GetValuesFrom (this PortalType _This, DomainType _That);
    
       public static PortalType Adapt (this DomainType _This) {
          PortalType ConvertedEntity = new PortalType ();
          ConvertedEntity.GetValuesFrom (_This);
          return ConvertedEntity;
       }
    
       public static DomainType Adapt (this PortalType _This) {
          DomainType ConvertedEntity = new DomainType ();
          ConvertedEntity.GetValuesFrom (_This);
          return ConvertedEntity;
       }
    }
    
    public static ProductAdapter : Adapter<BLL.Product, DAL.Product> {
       public override static void GetValuesFrom (this BLL.Product _This, DAL.Product _That) {
          _This.ProductId = _That.Id;
          // yada yada yada
       }
    
       public override static void GetValuesFrom (this DAL.Product _This, BLL.Product _That) {
          _This.Id = _That.ProductId;
          // yada yada yada
       }
    }
    
    公共抽象静态类适配器{
    public abstract static void GetValuesFrom(this DomainType _this,PortalType _this);
    public abstract static void getvalues from(this PortalType _this,DomainType _this);
    公共静态PortalType Adapt(此域类型\u此){
    PortalType ConvertedEntity=新的PortalType();
    ConvertedEntity.GetValuesFrom(_This);
    回报转化率;
    }
    公共静态域类型自适应(此PortalType\u此){
    DomainType ConvertedEntity=新的DomainType();
    ConvertedEntity.GetValuesFrom(_This);
    回报转化率;
    }
    }
    公共静态ProductAdapter:适配器{
    public override static void getvalues from(this BLL.Product\u this,DAL.Product\u this){
    _This.ProductId=\u That.Id;
    //雅达雅达雅达
    }
    public override static void getvalues from(this DAL.Product\u this,BLL.Product\u this){
    _This.Id=\u That.ProductId;
    //雅达雅达雅达
    }
    }
    
    这存在一些严重的编译问题。首先,不能有一个带有泛型的静态类。所以取而代之的是

    public static abstract class Adapter {
       public static PortalType Adapt<PortalType, DomainType> (this DomainType _This) {}
    }
    
    公共静态抽象类适配器{
    公共静态PortalType Adapt(此域类型_this){}
    }
    
    但是。。。如果不通过方法参数指定所有泛型类型,则无法在方法中定义多个泛型类型。()

    经过一些研究,发现了像和这样的东西,我有种直觉,我可以用一个像fluent一样的API更进一步。(方法链接?)


    让我的天真解决方案发挥作用的正确语法是什么?

    TL;马特博士,如果你需要帮助,试着缩短它。。请记住,人们这样做是没有报酬的。只需创建一个映射器类,该类要么只映射具有相同名称的属性,要么添加一些其他机制来传递映射路由。映射可以使用反射和添加泛型来避免强制转换。您的解决方案一点也不幼稚。任意类型之间的一般映射不是一个简单的练习。如果您将
    ToPortalType
    ToDomainType
    约束为具有无参数构造函数,则可以将它们移动到泛型基类。同时请记住,扩展方法和fluent接口只是语法糖-它们使方法调用看起来更干净,但本身没有添加任何功能。@DStanley实际上,它们的功能甚至更少,因为它们更加模糊。换句话说,在某些情况下,编译器会给出扩展方法调用语法的错误,而不会给出静态方法调用语法的错误。
    public static abstract class Adapter {
       public static PortalType Adapt<PortalType, DomainType> (this DomainType _This) {}
    }