0

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

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
    { ... }
  • 这行得通,因为我知道TTransferand的类型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
}
  • domaintransfer对象都被正确创建。

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

4

1 回答 1

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().

于 2013-09-27T19:35:43.237 回答