2017-02-10 18 views
-1

У меня есть абстрактный класс FactoryСоздать экземпляр универсального типа, который принимает параметр вторичного общего типа

Завод имеет метод createModel()

public abstract class Factory<T, U>{ 

    public T CreateModel(IDictionary<String, Object> parametersDictionary) 
     { 
      T toReturn; 

      if (ValidateDictionary(parametersDictionary) != true) 
       return null; 
      else 
      { 
       toReturn = new T(U); 
      } 


      return toReturn; 
     }} 

В заявлении еще, я хочу для создания экземпляра Car с объектом CarPart, который я получал бы от вызова другого метода. Эта логика будет применяться к другим подтипам Factory, поэтому я хочу наследовать этот метод. Проблема в том, что я не могу создать экземпляр Car Car с другим общим параметром.

Я огляделся и обнаружил, что могу использовать класс Activator.

(T) Activator.CreateInstance (typeof ( Car), args);

Это, однако, работает, только если у вас есть определенный тип, который вы хотите передать конструктору.

Я также попытался сделать:

общественный завод абстрактный класс, где T: новый()

Но это не позволит мне разобрать ни одного аргумента в конструктор.

Как я могу реализовать этот абстрактный класс?

Edit1: изменили именование разъяснений

Edit2: Для уточнения, U представляет собой структуру, которая содержит aproximatelly 20 параметров, необходимых для создания T. Таким образом, для того, чтобы создать новый T, мне нужно передать его U объект, который инкапсулирует все 20 параметров.

+1

Что такое 'T'? Я могу видеть только определение типа для 'Car' и' CarPart'. Я предполагаю, что 'T' должен быть' Car'. – HimBromBeere

+0

вопрос неясно также, если вам нужна фабрика, то дайте ему только вход CarPart, а внутри CreateModel разрешите, какой объект вы хотите вернуть - Factory должен решить для вас, что он должен вернуть. – Vladimir

+0

Можете ли вы показать «конструктор автомобиля»? Btw: Я думаю, вы confues на имена параметров типа. Я предлагаю вам использовать 'T' и' U' для общего параметра в определении вашего заводского класса, и чем может показаться, что в настоящее время «Автомобиль», похоже, и тот, и другой - имя общего параметра и имя существующего класс. – HimBromBeere

ответ

0

После того, как Abion47 указал, что у Activator.CreateInstance не должно быть никаких проблем с тем, что мне нужно для этого, я немного посмотрел на проблему и сделал ее работу.

Для всех, кто мог бы прийти через это:

public abstract class Sentinel<T,U> where T: new() where U: new() 
{ 
    public T CreateModel(IDictionary<String, Object> parametersDictionary) 
    { 
     T toReturn ; 

     if (ValidateDictionary(parametersDictionary) != true) 
      return default(T); 
     else 
     { 
      U parameters = ParseDictionaryToParameters(parametersDictionary); 
      toReturn = (T)Activator.CreateInstance(typeof(T), new object[] {parameters}); 
     } 

     //If we got this far then everything should be fine. 
     return toReturn; 
    } 

    public abstract U ParseDictionaryToParameters(IDictionary<String, Object> parametersDictionary); 

    public abstract Boolean ValidateDictionary(IDictionary<String, Object> parametersDictionary); 
} 

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

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