C#动态类型调用Body扩展方法AddText报错求助
问题解决:Dynamic类型调用扩展方法失败
问题原因
C#的扩展方法本质是静态类中的静态方法,instance.AddText()这种写法是编译器提供的语法糖,编译时会被转换成OpenXMLExtensions.AddText(instance)。但当参数是dynamic类型时,方法调用的绑定会延迟到运行时,而.NET的运行时绑定器不会自动搜索静态类中的扩展方法,因此会抛出找不到方法的异常。
解决方案
提供三种可行的解决方式,按需选择:
1. 显式调用静态扩展方法
直接绕过语法糖,以静态方法的形式调用,运行时能正确识别:
public static dynamic ProcessReportDefinition(dynamic parentElement, OB.ReportDefinition.ReportItem reportItem, OB.TenableSC.Json snapshot_data, int level=0){ // 直接调用静态类的方法,无需语法糖 OB.OpenXMLExtensions.AddText(parentElement, "text"); }
2. 将Dynamic参数强转为具体类型
在方法内部先把dynamic类型的parentElement转换为Body类型,再调用扩展方法:
public static dynamic ProcessReportDefinition(dynamic parentElement, OB.ReportDefinition.ReportItem reportItem, OB.TenableSC.Json snapshot_data, int level=0){ if (parentElement is DocumentFormat.OpenXml.Wordprocessing.Body body) { body.AddText("text"); } // 其他逻辑 }
3. 替换Dynamic参数为具体类型
如果ProcessReportDefinition方法只处理Body类型的参数,直接把参数类型从dynamic改成Body,从根源避免动态绑定问题:
// 修改参数类型为Body public static dynamic ProcessReportDefinition(DocumentFormat.OpenXml.Wordprocessing.Body parentElement, OB.ReportDefinition.ReportItem reportItem, OB.TenableSC.Json snapshot_data, int level=0){ parentElement.AddText("text"); }
内容的提问来源于stack exchange,提问作者oth
相关产品推荐
相关产品推荐

