自定义通用 DTO 汇编程序
本文关键字:汇编程序 DTO 自定义 | 更新日期: 2023-09-27 18:33:09
我正在尝试创建一个可以像这样使用的方法:
Assembler.CreateTransfer(i);
-
i
是dynamic
集合中的一个项目。 -
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
{ ... }
- 这有效,因为我知道
TTransfer
和TDomain
的类型. - 我可以这样称呼它:
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
}
domain
和transfer
对象都已正确创建。
主要问题是:有什么办法可以打电话给CreateTransfer<domain, transfer>(d)
吗?任何帮助将不胜感激。
可以使用反射来调用泛型方法。
像这样:
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()
的结果。