Тип C # или пространство имен ожидаемая путаница - PullRequest
5 голосов
/ 19 августа 2011

Меня слегка смущает ошибка C #.

Type t = thing.GetType()

t теперь является типом.но если я попытаюсь сделать это:

new GenericThing<t>

, я получу предупреждение о типе или ожидаемом пространстве именЧего мне не хватает?

Ответы [ 4 ]

2 голосов
/ 19 августа 2011

t - это экземпляр объекта типа Type, то есть тот, который существует только во время выполнения. Обобщения работают во время компиляции и ожидают имя типа.

Я думаю, вы согласны с тем, что следующее не имеет смысла:

Type t = thing.GetType()
TypeOfThing instance = new t();

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

2 голосов
/ 19 августа 2011

t - объект типа, созданный во время выполнения.Обобщения ожидают имя типа, разрешенное во время компиляции.Чтобы создать универсальный во время выполнения, вы должны использовать MakeGenericType

Например:

Activator.CreateInstance(typeof(GenericThing<>).MakeGenericType(t));
1 голос
/ 19 августа 2011

Type - это класс, который представляет тип, а не , являющийся единицей, поэтому вы не можете использовать экземпляр Type в месте, которое ожидает тип или тип параметр.

0 голосов
/ 19 августа 2011

вы должны сделать что-то вроде этого:

var youGeneric = typeof(GenericThing<>).MakeGenericType(t)
                                       .GetConstructor(Type.EmptyTypes)
                                       .Invoke(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...