我正在尝试创建一个可以像这样使用的方法:
Assembler.CreateTransfer(i);
i
是dynamic
集合中的一个项目。i
是域对象。CreateTransfer()
应返回i
类型+转移的实例(如果我的域对象为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)
?任何帮助都将不胜感激。
答案 0 :(得分:1)
您可以使用反射来调用泛型方法。
这样的事情:
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()
的结果。