【问题标题】:Reflection with T4 Templates使用 T4 模板进行反射
【发布时间】:2011-09-26 17:25:44
【问题描述】:

我有一个名为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 指令或程序集引用?)。我需要知道的是如何在 typeof() 方法中传递 VideoGame 类。我尝试了以下方法:

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);

【问题讨论】:

    标签: c# asp.net-mvc templates t4


    【解决方案1】:

    typeof(modelName.GetType()) 永远不会起作用,因为 modelName.GetType() 返回 System.String 的运行时类型。

    modelName.GetType 也有同样的问题。

    typeof(modelName) 不起作用,因为 modelName 是一个字符串,而 typeof 需要一个 Type。

    所以....如果您有一个字符串“VideoGame”并且您想要获取类型 VideoGame...上的方法....

    我愿意:

    Type.GetType(modelName).GetMethods()
    

    Type.GetType 将返回指定名称的类型。请注意,这需要一个程序集限定名称....所以仅提供 VideoGame 是不够的。您需要 modelName 采用以下形式:

    MyNamespace.VideoGame, MyAssemblyThatContainsVideoGame
    

    此外,这意味着运行 T4 代码的任何内容都需要引用 MyAssemblyThatContainsVideoGame。

    【讨论】:

    • 好的,当我传入程序集(与命名空间相同)时,我得到:Project.Games 是一个“命名空间”,在给定的上下文中无效
    • 你能提供准确的代码吗?我想你有类似 Type.GetType(string.Format("{0}, {1}", modelName, modelName.Split('.')[0]))
    • 等等...您是在尝试获取代码 GENERATOR 中的方法列表,而不是 GENERATED CODE,对吧?
    • var modelName = Model.modelName; var AssemblyName = Project.Games.dll; MethodInfo[] methodInfos = Type.GetType(modelName).GetMethods(BindingFlags.Public | BindingFlags.Static);
    • var AssemblyName = Project.Games.dll;没有意义...尝试 var assemblyName = "Project.Games";和 var methods = Type.GetType(string.Format("{1}.{0}, {1}", modelName, assemblyName).GetMethods(BindingFlags.Public | BindingFlags.Static)
    【解决方案2】:

    如果您想将名称作为字符串传递,请使用Activator.CreateInstance

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-10
      • 2011-04-07
      • 1970-01-01
      • 2013-09-29
      • 2013-12-30
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多