我实现了一些
Excel.Range
扩展方法,这些方法已经运行良好一段时间了。
下面的仍然有效(我用
using Excel = Microsoft.Office.Interop.Excel;
指定 Range,因为 Range
也存在于 System
命名空间中):
public static T Get<T>(this Excel.Range range)
{
var value = range.Value;
if (range.Value is null)
{
return default;
}
try
{
return (T)value;
}
catch (Exception ex)
{
throw new Exception($"Unable to convert {range.Value.GetType()} to {typeof(T)}!", ex);
}
}
但这会在执行过程中(而不是编译)引起问题:
public static T? GetNullable<T>(this Excel.Range range) where T : struct
{
if (range is null)
{
return null;
}
var value = range.Value;
if (value is null)
{
return null;
}
if (value.ToString() == string.Empty)
{
return null;
}
return (T)value;
}
我在 XUnit 测试中遇到以下错误,
rg.GetNullable<int>()
:
留言: System.MissingMethodException:找不到方法:'System.Nullable`1
Interop.Library.Helpers.RangeExtensionMethods.GetNullable(Microsoft.Office.Interop.Excel.Range)'。
堆栈跟踪:
RangeExtensionMethods.GetNullable_NullInt_ReturnsNull()
RuntimeMethodHandle.InvokeMethod(对象目标,Void**参数,签名sig,布尔isConstructor)
MethodBaseInvoker.InvokeWithNoArgs(对象 obj,BindingFlags invokeAttr)
有人知道导致该问题的原因吗?我清理了代码并重建了几次,这已经工作了一段时间了。
我刚刚从头开始使用基本的控制台应用程序进行了测试。如果我在控制台项目中包含
GetNullable<T>()
方法,它可以正常工作,但如果我将它移动到一个单独的类库(从头开始极简),它也会失败。
现在,我想知道昨天我从 Excel 传输数据(到 SQLServer)时是否发生了该错误。我有几个表,第一个表没有问题,但后来出现了一些我不明白的错误。
我在处理数据访问(CRUD 方法)的库中做了同样的事情(重复扩展方法),看起来一切都传输得很好。
当我有更多时间时,我会看看其他讨论。
PS:我检查了是否从所有项目属性中删除了
<Nullable>enable</Nullable>
。