C# 返回应用程序类型。在特殊情况下进行评估

C# 返回应用程序类型。在特殊情况下进行评估,c#,excel,office-interop,C#,Excel,Office Interop,我试图用C语言编写一个方法,在给定Excel工作簿中命名区域的名称后,该方法将检索该区域中的值。我希望它能够工作,即使指定的范围不是对范围的纯引用(例如=Sheet1!A1:A10),而是类似于={1,2,3,4,5}或=OFFSET(Sheet1!A1:A10,3) 我正在做以下工作: Excel.Application xl = ...; Excel.Name name = ...; object value = xl.Evaluate(name.Value); // if it's a

我试图用C语言编写一个方法,在给定Excel工作簿中命名区域的名称后,该方法将检索该区域中的值。我希望它能够工作,即使指定的范围不是对范围的纯引用(例如
=Sheet1!A1:A10
),而是类似于
={1,2,3,4,5}
=OFFSET(Sheet1!A1:A10,3)

我正在做以下工作:

Excel.Application xl = ...;
Excel.Name name = ...;

object value = xl.Evaluate(name.Value);
// if it's a range, turn it into an object[] or object[,]
if (value is Excel.Range) value = ((Excel.Range)value).Value2;

if (value is object[]) {
    // do stuff
} else if (value is object[,]) {
    // do slightly different stuff
}
我原以为一个名为range的值如
={1,2,3,4,5}
会作为
对象[]
对象[,]
,但事实并非如此
value.GetType()
只是报告
System.\uu-ComObject
(编辑:现在我得到的是
System.Object[*]
,无法复制
System.\uu-ComObject
-但它仍然不能强制转换到
对象[]
),我无法进一步缩小范围

我应该将
值转换为什么类型

编辑:这里是一些测试代码和输出。这可能是一个更简单的问题,“究竟什么是
系统.Object[*]
,谷歌的变化无常不允许我搜索它

代码:

输出:

System.Object[*]

假的

System.Object[*]


edit2:如果我改为计算
“={1;2;3;4;5}”
,那么我会得到一个
对象[,]

我想这是因为Excel创建的数组不是基于0的,而是基于1的,您可以这样转换它:

object[] ints = ((Array)value).ToArray<object>();
您将获得一个
System.InvalidCastException:无法将类型为“System.object[*]”的对象强制转换为类型为“System.object[]
”,因为新的.NET 4互操作层将尝试自动创建标准数组。因此,您需要改为执行此操作(就像您在代码中所做的那样):

objectvalue=xl.Evaluate(“={1,2,3,4,5}”);
对象[]整数=((数组)值).ToArray();

您有确切的代码(可能还有文件)吗这表明了这种行为?Evaluate是一种非常通用的方法。在我看来,它像是一个互操作错误。使用VBA,您可以将Evaluate分配给VBA变量,然后测试该变量。但是Evaluate可能实际上返回一个xlOper数据结构,VBA会在封面下无形地将其转换为变量。Evaluate是一种非常奇怪的方法:请参见值是动态类型,您得到的值为dynamic“dynamic value=xl.Evaluate(name.value));“然后您可以稍后将其转换为期望的类型。@SimonMourier我发布了一个示例
object[] ints = ((Array)value).ToArray<object>();
public static T[] ToArray<T>(this Array array)
{
    if (array == null)
        return null;

    if (array.Rank != 1)
        throw new NotSupportedException();

    var newArray = new T[array.GetLength(0)];
    var lb = array.GetLowerBound(0);
    for (int i = 0; i < newArray.Length; i++)
    {
        newArray[i] = (T)array.GetValue(i + lb);
    }
    return newArray;
}
dynamic value = xl.Evaluate("={1,2,3,4,5}"); // or var instead of dynamic
object value = xl.Evaluate("={1,2,3,4,5}");
object[] ints = ((Array)value).ToArray<object>();