是否可以在T4模板内的COM对象上使用后期绑定?

时间:2012-07-02 15:09:50

标签: c# .net c#-4.0 t4

我的T4模板实例化一个Excel COM对象来读取一些单元格值并从中创建C#类。我在常规C#中首先编写了Excel阅读逻辑,工作正常。我在此测试中使用的代码段是:

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模板中进行后期绑定工作?

1 个答案:

答案 0 :(得分:4)

T4和C#都可以使用'dynamic'关键字处理动态绑定。如果没有此关键字,也无法推断出来。

但是,在常规IDE中,可以在程序集引用上设置标记“嵌入互操作类型”。此功能将引用的互操作类型直接复制到使用程序集中,并且还可以在运行时转换“对象”引用'动态'。

因此,问题中的示例代码在IDE中的正常C#中编译,因为'Item'集合被转换为返回'dynamic'。

T4没有“assembly”指令的等效标志,因此您必须手动将表达式声明为动态。为此,您必须在模板中包含以下assembly指令:

<#@ assembly name="System.Core" #>
<#@ assembly name="Microsoft.CSharp" #>