【问题标题】:Reflection with T4 get assemblies反射与 T4 获取程序集
【发布时间】:2013-02-16 11:46:27
【问题描述】:

我想获取特定程序集中的所有类,这是我的代码

 var assembly=Assembly.GetExecutingAssembly();

 var assemblies = assembly.GetTypes().Where(t => String.Equals(t.Namespace, "RepoLib.Rts.Web.Plugins.Profiler.Models", StringComparison.Ordinal)).ToArray();

当 c# 代码一切正常时,我得到了我的程序集,但是当写入 t4 文件时,我没有任何错误,但我的程序集计数是。

【问题讨论】:

    标签: c# reflection t4


    【解决方案1】:

    在 T4 模板中,执行的程序集不是您的,而是来自 T4 引擎的程序集。

    要从您的程序集中访问类型,您必须执行以下步骤:

    1. 在模板中添加对您的程序集的引用。把它放在它的顶部:

      <#@ assembly name="$(SolutionDir)<Project>\bin\Debug\<Project>.dll" #>
      
    2. 导入程序集的命名空间。把它放在上一行的下面:

      <#@ import namespace="<Project>.<Namespace>" #>
      
    3. 要访问此程序集中的类型,请选择其中一个并从中获取程序集:

      var assembly = typeof(<Type in assembly>).Assembly;
      var types = assembly.GetTypes()
                          .Where(t => String.Equals(
                              t.Namespace,
                              "RepoLib.Rts.Web.Plugins.Profiler.Models",
                              StringComparison.Ordinal))
                          .ToArray();
      

    【讨论】:

    • 什么是?
    • @ShahroozJefri:您想要从中获取所有类型的程序集中的任何类型。例如,它可能是RepoLib.Rts.Web.Plugins.Profiler.Models 命名空间中的一种类型
    • 如果您不使用预处理模板,并且想要获取与 T4 模板所在的同一项目中的类型和类的信息,我建议您不要使用反射。 T4 模板在设计时进行了转换,因此 $(SoutionDir)\bin\Debug\.dll 引用的程序集可能来自您的上次构建并且已过时!您可能想要使用 Visual Studio 代码模型(请参阅此处:stackoverflow.com/questions/14134016/design-time-reflection/…
    • @Nico:感谢您的评论。我不知道这一点。
    • 没有类型怎么能做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 2020-08-24
    • 2023-04-04
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多