ExpandoObject 对象和 GetProperty()
ExpandoObject object and GetProperty()
我正在尝试编写一个通用实用程序,以便通过 .NET 外部的 COM 使用(/跳过长话)。无论如何,我正在尝试向 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 中得到一个 null?我显然不明白,但我已经盯着它看了一天了,但我一无所获。谢天谢地,所有 help/criticism 都接受了!
虽然使用 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
的实际实现可以找到 here。
我正在尝试编写一个通用实用程序,以便通过 .NET 外部的 COM 使用(/跳过长话)。无论如何,我正在尝试向 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 中得到一个 null?我显然不明白,但我已经盯着它看了一天了,但我一无所获。谢天谢地,所有 help/criticism 都接受了!
虽然使用 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
的实际实现可以找到 here。