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