2013-09-27 7 views
0

Я пытаюсь создать метод, который может быть использован, как это:Пользовательские общий DTO Ассемблер

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)? Любая помощь будет оценена по достоинству.

ответ

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: Проблема в том, что у вас есть два метода с тем же именем и количеством параметров в одном классе. См. Обновление, он должен исправить эту проблему –

 Смежные вопросы

  • Нет связанных вопросов^_^