1

わかりました、私は現在のプロジェクトでここで少し先を考えているので、この質問がどれほど曖昧になるかをお詫びします. ソリューションの 1 つのプロジェクトで、ソリューション内の他のアセンブリの 1 つを参照し、他のアセンブリのエクスポートされた型を検査し、それらのメタデータを使用して他のコードを構築する T4 テンプレートを持つことは可能ですか? そのアセンブリ ディレクトリ内の型を参照する必要はありません。特定の基本クラスから派生したすべての型のリストと、それらに関するメタデータを取得できる必要があるだけです。AJAX呼び出し中にクライアントにスローするために、それらからDTOクラスを生成する簡単な方法として、共通の基本クラスから構築され、NHibernateによってデータベースにダンプされるいくつかのオブジェクトに対してこれを具体的に行うことを考えています。私は絶対に完璧な解決策を探しているわけではありません。

繰り返しますが、具体的な例はありません。この問題に正面からぶつかるまで数日かかりますが、このオプションは、私が遭遇する可能性のある多くのケースをカバーする可能性があることに気づきました。

考え?

4

2 に答える 2

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 に答える
1

はい、これで問題ありません。<#@ assembly #> ディレクティブを使用できます。また、$(SolutionDir) やその他の VS マクロを使用して、他のプロジェクトの出力に移動するための開始点を取得できます。次に、リフレクションを使用して、関心のあるメタデータを読み取ることができます。

于 2012-07-07T07:26:47.047 に答える