我的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模板中进行后期绑定工作?
答案 0 :(得分:4)
T4和C#都可以使用'dynamic'关键字处理动态绑定。如果没有此关键字,也无法推断出来。
但是,在常规IDE中,可以在程序集引用上设置标记“嵌入互操作类型”。此功能将引用的互操作类型直接复制到使用程序集中,并且还可以在运行时转换“对象”引用'动态'。
因此,问题中的示例代码在IDE中的正常C#中编译,因为'Item'集合被转换为返回'dynamic'。
T4没有“assembly”指令的等效标志,因此您必须手动将表达式声明为动态。为此,您必须在模板中包含以下assembly
指令:
<#@ assembly name="System.Core" #>
<#@ assembly name="Microsoft.CSharp" #>