Создайте экземпляр конкретного типа универсального, используя отражение во время выполнения - PullRequest
2 голосов
/ 18 октября 2011

Рассмотрим следующий класс:

public class GenericClass<T>
{
   public T Argument;                
}

И второй класс, который ссылается и использует GenericClass:

public class ClientClass
{
    GenericClass<T> genclass = new GenericClass<T>();
}

Моя проблема в том, что я не знаю тип Tво время компиляции.Я использую отражение во время выполнения, чтобы получить тип T. Возможно ли как-то использовать параметризованное выражение при создании экземпляра GenericClass?

1 Ответ

5 голосов
/ 18 октября 2011

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

Сначала нужно получить открытый универсальный с помощью оператора typeof:

var openType = typeof(GenericClass<>);

Далее вам нужно создать конкретный шаблон, который вам нужен. Допустим, ваш требуемый тип T хранится в переменной type:

var closedType = openType.MakeGenericType(type);

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

object instance = Activator.CreateInstance(closedType);

Однако, как отметил xanatos в комментариях, вы должны знать, что это приводит к члену типа object. Чтобы иметь возможность манипулировать объектом без отражения, у вас есть два варианта.

  1. Вы можете создать родительский класс GenericClass, из которого происходит GenericClass<T>, и включить в него методы, которые являются общими для всех. (т. е. GenericClass содержит членов, которым не нужно использовать T.
  2. Как Ingenu упоминал в комментариях к вопросу, вы можете создать интерфейс IInterface, а затем добавить ограничение на T, where T : IInterface. Затем вы можете привести instance к GenericClass<IInterface> и манипулировать им таким образом. Очевидно, type должен реализовывать IInterface в этом случае.

Конечно, вы также можете просто сохранить ссылку object и манипулировать ею, используя только отражение, или использовать dynamic для поздней привязки вызовов любого метода - однако это использует отражение под капотом.

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