【发布时间】:2023-03-12 08:14:01
【问题描述】:
我有一个第三方 DLL,它返回 Customers、Orders 等对象。我将它们称为 Your Entities。它们确实有一个通用的IYourEntity 接口,因此我可以将其用作源约束。
我想创建一个通用的转换扩展方法,将所有这些不同的第三方实体转换为My Entities,并使用一些简化且更易于维护的代码。
....但是我不知道如何制作一个通用的扩展方法,它将调用具体的扩展方法来进行每个类的特定转换。
将我的代码的一些主要方面放在下面,但您可以充分利用here。
是的,我可能表明我对如何做到这一点有点无能为力,并且可能试图结合不同的概念。任何指针都非常感谢,因为我已经打了几天的头,需要一条生命线:)
public interface IYourEntity
{
int Id
{
get;
set;
}
}
public interface IConvertToMyEntity<TYourEntity, TMyEntity>
where TYourEntity : class, IYourEntity, new()
where TMyEntity : class, IMyEntity, new()
{
TMyEntity ToMyEntity(TYourEntity yourEntity);
}
public static class ExtensionMethods
{
private static IMyEntity ToMyEntity(this IYourEntity yourEntity)
{
return new MyEntity1();
}
public static List<IMyEntity> ToMyEntityList(this List<IYourEntity> lstYourEntities)
{
return lstYourEntities.ConvertAll(q => q.ToMyEntity());
}
}
public class YourEntity1 : IYourEntity, IConvertToMyEntity<YourEntity1, MyEntity1>
{
public int Id
{
get;
set;
}
public string YourEntityName
{
get;
set;
}
public MyEntity1 ToMyEntity(YourEntity1 yourEntity)
{
return new MyEntity1()
{Id = yourEntity.Id, MyEntityName = yourEntity.YourEntityName, CreatedOn = DateTime.UtcNow};
}
public List<MyEntity1> ToMyEntityList(List<YourEntity1> lstYourEntities)
{
return lstYourEntities.ConvertAll(q => ToMyEntity(q));
}
}
【问题讨论】:
-
您说
YourEntitys 来自第三方DLL,但它们似乎通过IConvertToMyEntity接口与MyEntitys 耦合。你能解释一下你能控制什么吗? -
@MarcoLuzzara 是的,它们来自第三方。我试图创建 IConvertToMyEntity 接口来尝试解决这个问题,但这种方法可能不正确。我的目标是能够在通用方法中执行此操作,以转换我从该第三方检索到的任何第三方对象列表。即
List<IYourEntity> lstYourEntities.ToMyEntities(),它将调用特定于实体类型的转换方法来获取我的实体列表。 -
只需采取简单的方法并使用自动映射器。无论您需要使用相同的属性名称还是为不匹配的属性名称创建手动映射,如果是这种情况,那么只需使用自动映射器就可以了
-
@johnny5 是的,我可以使用 AutoMapper 来完成复制数据的具体细节,但这里的难点在于如何创建一个通用方法来知道要使用哪些映射。
-
crichavin,我不明白为什么这很困难。 1. 你知道你要适应和适应的类型。例如,在您的示例中,
YourEntity1, MyEntity1只需输入IAdaptable<YourEntity,MyEntity>,只要您需要它,只需调用 convert。
标签: c# generics extension-methods c#-7.0