2013-09-27 31 views
0

我試圖創造出可以這樣使用方法:自定義泛型DTO彙編

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

您可以使用反射來調用泛型方法。

事情是這樣的:

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()至少結果。

+0

+1謝謝丹尼爾,但不幸的是,這並沒有奏效,它引發了一個抱怨模棱兩可的例外。暫時我主動調用'CreateTransfer (domainObject)'。 – Esteban

+0

@Esteban:問題是你有兩個方法在同一個類中具有相同的名字和參數個數。請參閱更新,它應該解決這個問題 –