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 object and GetProperty()

当使用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的实际实现可以在这里找到