C# ExpandoObject对象和GetProperty()

C# ExpandoObject对象和GetProperty(),c#,dynamic,expandoobject,C#,Dynamic,Expandoobject,我正在尝试从.NET外部编写一个通过COM使用的通用实用程序(/skip long story)。无论如何,我正在尝试向ExpandooObject添加属性,我需要将PropertyInfo结构返回到另一个例程 using System.Collections.Generic; using System.Diagnostics; using System.Dynamic; using System.Reflection; public class ExpandoTest { publi

我正在尝试从.NET外部编写一个通过COM使用的通用实用程序(/skip long story)。无论如何,我正在尝试向ExpandooObject添加属性,我需要将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;
    }
}
使用System.Collections.Generic;
使用系统诊断;
运用系统动力学;
运用系统反思;
公共类扩展测试
{
公共字符串testThis(字符串变量)
{
字符串cOut=“”;
ExpandoObject oRec=新的ExpandoObject{};
IDictionary oDict=(IDictionary)oRec;
添加(可变,“测试”);
Trace.WriteLine(可变);
Trace.WriteLine(oDict[cvvariable]);
PropertyInfo thisProp=oRec.GetType().GetProperty(CVVariable);
如果(thisProp!=null)
{
cOut=“Got a property:)”;
}
返回cOut;
}
}

为什么我总是在这个道具中得到空值?我显然不明白,但我已经盯着它看了一天了,我什么也没得到。感谢接受所有的帮助/批评

使用
ExpandoObject
时,您可能会觉得可以在运行时添加属性,但实际上在CLR级别不会这样做。这就是为什么使用反射来获取您在运行时添加的属性将不起作用

ExpandoObject
视为将字符串映射到对象的字典会有所帮助。当您将
ExpandoObject
视为
dynamic
变量时,对属性的任何调用都会路由到该字典

dynamic exp = new ExpandoObject();
exp.A = "123";
实际调用相当复杂,涉及DLR,但其效果与编写相同

((IDictionary<string, object>)exp)["A"] = "123";


可以找到
ExpandoObject
的实际实现。

您正在查找
ExpandoObject
类本身的属性。对于您刚刚创建的属性,您将无法获得
属性info
(它不存在,即使
dynamic
让您认为它存在)。这里没有什么神奇的。不过,您可以获得一个
PropertyDescriptor
。我不确定您的用例是什么,但您可能希望实现DirectReflect接口。当与COM互操作一起使用时,这将允许您实现自定义IDispatch接口@Lucastzesniewski所有使用ExpandoObject的示例似乎都能做到这一点,甚至可以在末尾添加
.GetValue(oRec,null)
(例如)@shf301我只是通过COM接口传入字符串参数(字符串包含XML,但仍然是字符串)。它被用来实现用户可配置的文本文件导入器(csv、制表符分隔等),但所有的复杂性都包含在.NET代码中。这只是没有定义好的数据。我需要建立一个用于CsvHelper的动态映射,我需要将它传递给PropertyInfo结构(使用我的示例)@lucastzesniewski您是对的。我回头看了所有我翻阅过的文章,它们是使用dynamic而不是Expando的例子。我希望它以某种方式装饰它,将它们添加为“虚拟”财产,但可惜不是。谢谢你的帮助。谢谢@dirk。我必须找到另一种方法来定义映射。
var exp = new ExpandoObject();
exp.A = "123"; // compile-time error