【发布时间】:2011-07-13 19:00:10
【问题描述】:
我在 c# 中将 com 对象定义为动态类型,我可以很容易地调用方法。 但是,当我尝试访问同一对象上的属性时,我得到一个无效的强制转换异常。
有问题的对象是一个数组,从 JavaScript 传递给托管代码,我希望将它的长度属性作为 int 获取。
我知道我遗漏了一些奇怪的东西,因为我没有收到“不包含定义”异常,我可以使用反射/InvokeMember 轻松访问该属性。
为什么我不能将动态类型的长度属性转换为int?
例如
这失败了
dynamic com = comObject;
int i = com.length; // RTBE here.
这可行
Type type = comObject.GetType();
int i = (int)type.InvokeMember("length", BindingFlags.GetProperty, null, comObject, null);
* 更新 *
经过大量测试后,我将这种奇怪的情况缩小到多维数组的情况。 所讨论的 com 对象是从 html 文档传递到托管代码的参数。出于所有意图和目的,该对象有时在 JavaScript 中看起来像这样。
var x = ["a1", "a2", "a3"];
当这样的数组出现在托管代码中时,我可以使用动态类型获得长度 AOK。 (即这里第一个失败的例子实际上是有效的)。但是,如果是多维数组比如JavaScript中的如下结构。
var y = [["b1", "b2", "b3"], "a2", "a3"];
然后在尝试动态访问其长度属性时出现错误。请注意,在这种情况下,我仍然可以通过反射访问长度。在我看来,由于某种原因,当多维数组用作动态类型时,长度属性没有得到正确映射......
在我的情况下,我已经解决了(!?)这是在传递它之前向数组添加一个“length_”属性。
var y = [["b1", "b2", "b3"], "a2", "a3"];
y.length_ = y.length;
现在在托管代码中,我可以按预期访问此属性而不会出错。远非理想,但似乎工作......
dynamic com = comObject;
int i = com.length_; // 3!
进一步更新
好的,所以对象索引的长度属性似乎也丢失了动态类型。再次,它可以通过反射访问...
失败
dynamic com = comObject; // js array i.e. var x = [1, 2];
int i = com[0]; // MissingMemberException - Error while invoking [PROPERTYGET, DISPID(0)].
int i = com["0"]; // MissingMemberException - Error while invoking [PROPERTYGET, DISPID(0)].
作品
Type type = comObject.GetType();
int i = (int)type.InvokeMember("0", BindingFlags.GetProperty, null, comObject, null); // 1
【问题讨论】:
-
现实生活中的
int com.property是什么? -
是 javascript 对象的长度属性。
-
..我试过 int i = Convert.ToInt32(com.property);还有……
-
你试过 var i = com.property 吗?
-
@Taylor - 是的,相同的 ICE 使用 var
标签: reflection dynamic c#-4.0 properties