Отражение с помощью шаблонов T4 - PullRequest
2 голосов
/ 26 сентября 2011

У меня есть класс модели под названием VideoGame. Мне нужно, чтобы класс был передан в шаблон t4 с использованием отражения в этом методе.

MethodInfo[] methodInfos =
    typeof(type).GetMethods(BindingFlags.Public | BindingFlags.Static);

У меня есть следующие переменные.

//passed via powershell file - is a string "VideoGame"
var modelName = Model.modelName
Type type = modelName.GetType();

Я получаю сообщение об ошибке: «Тип или имя пространства имен« тип »не могут быть найдены (отсутствует директива using или ссылка на сборку?»). Что мне нужно знать, это как передать класс VideoGame внутри этого метода typeof (). Я пробовал следующее:

MethodInfo[] methodInfos =
    typeof(modelName.GetType()).GetMethods(BindingFlags.Public | BindingFlags.Static);
MethodInfo[] methodInfos =
    modelName.GetType.GetMethods(BindingFlags.Public | BindingFlags.Static);
MethodInfo[] methodInfos =
    typeof(modelName).GetMethods(BindingFlags.Public | BindingFlags.Static);

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

typeof (modelName.GetType ()) никогда не будет работать, потому что modelName.GetType () возвращает тип времени выполнения System.String.

modelName.GetType имеет ту же проблему.

typeof (modelName) не будет работать, потому что modelName является строкой, а typeof ожидает тип.

Итак .... если у вас есть строка "VideoGame" и вы хотите получить методы типа VideoGame ....

Я бы сделал:

Type.GetType(modelName).GetMethods()

Type.GetType вернет тип по указанному имени. ЗАМЕТЬТЕ, что для этого требуется полное имя сборки ... поэтому просто предоставить VideoGame недостаточно. Вам нужно ModelName быть в форме:

MyNamespace.VideoGame, MyAssemblyThatContainsVideoGame

Кроме того, это означает, что для запуска кода T4 должна быть ссылка на MyAssemblyThatContainsVideoGame.

0 голосов
/ 26 сентября 2011

Если вы хотите передать имя в виде строки, используйте Activator.CreateInstance

...