1

私のT4テンプレートは、Excel COMオブジェクトをインスタンス化して、いくつかのセル値を読み取り、それらからC#クラスを作成します。最初にExcelの読み取りロジックを通常のC#で記述しましたが、これは正常に機能します。このテストで使用するコードスニペットは次のとおりです。

Worksheet xlWorkSheet;
string cellContents = xlWorkSheet.Cells.Item[1, 1].Value;

ただし、テストコードをT4テンプレートに移植することはできません。次のエラーが表示されます。

Error 1: Compiling transformation: 'object' does not contain a definition for 'Value' and no extension method 'Value' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

これを解決する唯一の方法は、手動キャストを追加することです。

string cellContents = (xlWorkSheet.Cells.Item[1, 1] as Range).Value as string;

T4は「通常の」C#コンパイラを使用しているため、通常のコードと同じように動的バインディングを処理できるという印象を受けました。しかし、どうやら、違いがあります。この場合、どのタイプにキャストするかを推測できたので、問題を解決できました。しかし、一般的にはそうではありません。この遅延バインディングをT4テンプレートで機能させる方法はありますか?

4

1 に答える 1

4

T4とC#はどちらも、「dynamic」キーワードを使用して動的バインディングに対処できます。どちらもこのキーワードなしではそれを推測することはできません。

ただし、通常のIDEでは、アセンブリ参照にフラグ「埋め込み相互運用機能タイプ」を設定できます。この機能は、参照される相互運用機能タイプを消費アセンブリに直接コピーし、その場で「オブジェクト」参照を「動的」に変換します。 '。

したがって、質問のサンプルコードは、「Item」コレクションが「dynamic」を返すように変換されるときに、IDE内の通常のC#でコンパイルされます。

T4には、「アセンブリ」ディレクティブに相当するフラグがないため、式を手動で動的として宣言する必要があります。これを機能させるには、テンプレートに次のassemblyディレクティブも含める必要があります。

<#@ assembly name="System.Core" #>
<#@ assembly name="Microsoft.CSharp" #>
于 2012-07-03T03:25:19.833 に答える