自定义通用 DTO 汇编程序

本文关键字:汇编程序 DTO 自定义 | 更新日期: 2023-09-27 18:33:09

我正在尝试创建一个可以像这样使用的方法:

Assembler.CreateTransfer(i);
  • idynamic集合中的一个项目。
  • i是一个域对象。
  • CreateTransfer() 应该返回一个i类型为 + Transfer 的实例(如果我的域对象是 User ,那么它应该返回 UserTransfer 的实例。

至于我的模型是这样的:

public abstract class UserBase {
    public long UserId { get; set; }
    public string Username { get; set; }
}
public class UserTransfer : UserBase, ITransferObject { }
public partial class User : UserTransfer, IModelBase, IDomainObject {
    public User() {
        Roles = new List<Role>();
    }
    public virtual ICollection<Role> Roles { get; set; }
}

到目前为止,我已经完成了这个:

public static TTransfer CreateTransfer<TTransfer, TDomain>(TDomain d)
        where TTransfer : ITransferObject
        where TDomain : IDomainObject
    { ... }
  • 这有效,因为我知道TTransferTDomain的类型.
  • 我可以这样称呼它:CreateTransfer<UserTransfer, User>(d).

当我尝试在不指定任何类型的情况下创建 dto 时,问题就来了:

CreateTransfer(d);

当然,我已经为这个任务添加了重载,我希望我能神奇地完成以下任务:

public static ITransferObject CreateTransfer(IDomainObject d) {
    // do magic
    return CreateTransfer<transfer, domain>(d);
}

但在现实世界中,这是我所能得到的:

public static ITransferObject CreateTransfer(IDomainObject d) {
    var dType = d.GetType();
    var assemblyName = dType.Assembly.FullName;
    var domainName = dType.FullName;
    var transferName = domainName + "Transfer";
    var domain = Activator.CreateInstance(assemblyName, domainName).UnWrap();
    var transfer = Activator.CreateInstance(assemblyName, transferName).UnWrap();
    return CreateTransfer< ?, ?>(d); // Problem
}
  • domaintransfer对象都已正确创建。

主要问题是:有什么办法可以打电话给CreateTransfer<domain, transfer>(d)吗?任何帮助将不胜感激。

自定义通用 DTO 汇编程序

可以使用反射来调用泛型方法。

像这样:

var method = typeof(ClassThatDefinesCreateTransfer)
                 .GetMethods()
                 .Single(x => x.Name == "CreateTransfer" &&
                             x.IsGenericMethodDefinition)
                 .MakeGenericMethod(dType, transferType);
return (ITransferObject )method.Invoke(null, new object[] { d });

您可能希望至少缓存typeof(ClassThatDefinesCreateTransfer).GetMethods()的结果。