ExpandoObject object and GetProperty()
本文关键字:GetProperty and object ExpandoObject | 更新日期: 2023-09-27 18:10:36
我试图写一个通用的实用程序,通过COM使用从外部。net(/跳过长话短说)。无论如何,我试图添加属性到一个ExpandoObject,我需要得到PropertyInfo结构返回传递到另一个例程。
using System.Collections.Generic;
using System.Diagnostics;
using System.Dynamic;
using System.Reflection;
public class ExpandoTest
{
public string testThis(string cVariable)
{
string cOut = "";
ExpandoObject oRec = new ExpandoObject { };
IDictionary<string, object> oDict = (IDictionary<string, object>)oRec;
oDict.Add(cVariable, "Test");
Trace.WriteLine(cVariable);
Trace.WriteLine(oDict[cVariable]);
PropertyInfo thisProp = oRec.GetType().GetProperty(cVariable);
if (thisProp != null)
{
cOut= "Got a property :)";
}
return cOut;
}
}
为什么我总是得到一个空在thisProp?我显然不明白,但我已经盯着它看了一天了,一点头绪也没有。感谢地接受所有的帮助/批评!
当使用ExpandoObject
时,它可能看起来像你可以在运行时添加属性,它实际上不会在CLR级别这样做。这就是为什么使用反射来获取你在运行时添加的属性是行不通的。
可以把ExpandoObject
看作是一个将字符串映射到对象的字典。当您将ExpandoObject
视为dynamic
变量时,对属性的任何调用都会被路由到该字典。
dynamic exp = new ExpandoObject();
exp.A = "123";
实际的调用相当复杂,并且涉及到DLR,但其效果与写入
相同((IDictionary<string, object>)exp)["A"] = "123";
这也只适用于使用dynamic
。以上代码的强类型版本会导致编译时错误。
var exp = new ExpandoObject();
exp.A = "123"; // compile-time error
ExpandoObject
的实际实现可以在这里找到