ExpandoObject对象和GetProperty()

时间:2015-08-31 13:16:46

标签: c# dynamic expandoobject

我正在尝试编写一个通用实用程序,以便从.NET外部使用COM(/ skip long story)。无论如何,我正在尝试向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?我显然不明白,但我已经盯着它看了一天,我没有到达任何地方。感谢所有的帮助/批评!

1 个答案:

答案 0 :(得分:4)

使用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