Метод, который принимает тип объекта для создания и тип интерфейса, который он должен возвращать - это возможно? - PullRequest
1 голос
/ 17 июня 2011

Представьте себе код C #, подобный этому

ISomeInterface someVar = creator.Create(typeof(SomeClass), 
                                        typeof(ISomeInterface));

Что должно произойти?Метод creator.Create принимает два параметра: первый - это тип создаваемого объекта, второй - тип, к которому метод должен привести вновь созданный объект и вернуть как этот тип.

Итак, как в примере кода:мы хотим использовать интерфейс, мы знаем реализации классов, поэтому мы просим создать объект и указываем, что возвращаемый тип должен быть тем интерфейсом, который нас интересует.

Возможно ли вообще его реализовать?Дженерики, рефлексия, создание динамических методов на основе сложной декларации дженериков?что-то более сложное?Я открыт для предложений.

Конечно, мы не принимаем во внимание самое простое решение, которое явно приводит возвращаемое значение к ISomeInterface.Метод должен возвращать созданный объект в качестве интерфейса, о котором мы просили.

Если вам интересно, зачем он мне нужен, я пытаюсь усложнить свой рабочий код в тщетном поиске какого-то умного способа упростить мою фабрику классов:)

РЕДАКТИРОВАТЬ :

Текущий универсальный метод Create:

public T Create<T>(Type type)
{
   return (T)Activator.CreateInstance(type);
}

Но это не то, что я хочу, это предоставить два типа и в основном создать объектсначала, но вернись вторым.Это не тот случай, когда у меня есть метод Create для разных интерфейсов, реализованный в моей кодовой базе.

Дальнейший пример использования:

  IFoo f = Create(typeof(Foo), typeof(IFoo));
  IBar b = Create(typeof(Bar), typeof(IBar));

Итак, как вы видите, метод каждый раз возвращает разные интерфейсысогласно типу, указанному во втором параметре.И нет никакого способа использовать ограничения типа, или я не вижу, как это сделать.

Ответы [ 5 ]

2 голосов
/ 17 июня 2011

От макушки головы вы можете сделать что-то вроде этого:

public I Create<T, I>() where T : I {
    if(typeof(I).IsInterface) {
        return Activator.CreateInstance<T>();
    }
    /* Handle non-interface I calls with exception, etc */
}
1 голос
/ 17 июня 2011

Если вы хотите, чтобы ваш Create() метод возвращал ISomeInterface без явного приведения, то вам, очевидно, нужно сделать его Create<ISomeInterface>().

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

0 голосов
/ 17 июня 2011

Я думаю, что вы имеете в виду Duck Typing, если это похоже на утку, значит это утка!Набор текста
Объяснение утки

0 голосов
/ 17 июня 2011

Вы можете использовать общие ограничения типа :

public T Create<T,U,V> (U var1, V var2) 
where T: ISomeInterface 
where U: SomeClass
where V: ISomeInterface
{ 
 //Some code
}
0 голосов
/ 17 июня 2011

Это не похоже на безопасную вещь.

public TResult CreateToType<TType,TResult>() where TType : new() where TResult : class
{
    return new TType() as TResult;
}

Редактировать - хм, это на самом деле не будет делать то, что вы хотите, как вы пытаетесь привести к интерфейсу. Woops.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...