1

我的 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 模板中工作?

4

1 回答 1

4

T4 和 C# 都可以使用 'dynamic' 关键字处理动态绑定。没有这个关键字,两者都无法推断出来。

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

因此,问题中的示例代码在 IDE 中以普通 C# 编译,因为“项目”集合被转换为返回“动态”。

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

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