1

好的,我在我目前的项目中想得有点早,所以我为这个问题的含糊程度深表歉意。是否有可能在解决方案的一个项目中拥有一个 T4 模板,该模板引用解决方案中的其他程序集之一并检查其他程序集的导出类型并使用它们的元数据来构建其他代码?我不需要引用该程序集目录中的类型,我只需要能够获取从特定基类派生的所有类型的列表以及有关它们的一些元数据。我正在考虑专门针对从公共基类构建并由 NHibernate 转储到数据库的某些对象执行此操作,作为一种从它们生成 DTO 类以便在 AJAX 调用期间向客户端抛出的简单方法。我不是在寻找一个绝对完美的解决方案,

同样,我真的没有具体的例子。我距离正面遇到这个问题还有几天的时间,但我突然想到这个选项可能涵盖了我可能遇到的很多情况。

想法?

4

2 回答 2

1

是的,这应该没问题 - 您可以使用 <#@ assembly #> 指令,也可以使用 $(SolutionDir) 和其他 VS 宏来获取导航到其他项目输出的起点。然后你可以使用反射来读取你感兴趣的元数据。

于 2012-07-07T07:26:47.047 回答
1

我试图实现类似的东西,它工作正常。在下面的示例.tt文件中,我所指的同一解决方案中我自己的程序集的名称是SomeLibrary. 我正在反思的类是一个名为SomeLibrary.SomeInterface. 有一些方法可以使它更通用,但我不想让示例过于复杂。另外,请不要关注此模板的整体效果,这只是为了让您对它的工作方式有一个印象:

<#@ template language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="$(SolutionDir)$(SolutionName)\bin\$(ConfigurationName)\$(SolutionName).dll" #>
<#@ import namespace="System.Reflection" #>
<#
    Type someIType = typeof(SomeLibrary.SomeInterface);
#>
namespace SomeLibrary
{
    class <#=someIType.Name#>Impl: <#=someIType.Name#>
    {
        <#=someIType.Name#> encapsulatedIntf;
        public <#=someIType.Name#>Impl(<#=someIType.Name#> anIntf)
        {
            encapsulatedIntf = anIntf;
        }

        // Methods to be implemented:
<#
    MethodInfo[] methods = someIType.GetMethods();
    foreach (MethodInfo m in methods)
    {
#>
        // <#=m#>;
<#
    }
#>
    }
}

就我而言,这会导致

namespace SomeLibrary
{
    class SomeInterfaceImpl: SomeInterface
    {
        SomeInterface encapsulatedIntf;
        public SomeInterfaceImpl(SomeInterface anIntf)
        {
            encapsulatedIntf = anIntf;
        }

        // Methods to be implemented:
        // Int32 someMethod(Int32);
        // System.String someOtherMethod();
    }
}
于 2012-07-08T13:07:08.400 回答