自定义通用DTO汇编程序

时间:2013-09-27 19:16:12

标签: c# generics dto activator data-transfer-objects

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

Assembler.CreateTransfer(i);
  • idynamic集合中的一个项目。
  • 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
    { ... }
  • 这很有效,因为我知道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)任何帮助都将不胜感激。

1 个答案:

答案 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()的结果。