首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExpandoObject对象和GetProperty()

ExpandoObject对象和GetProperty()
EN

Stack Overflow用户
提问于 2015-08-31 13:16:45
回答 1查看 8.3K关注 0票数 4

我正在尝试编写一个通用实用程序,以便通过.NET外部的COM使用(/skip长篇小说)。无论如何,我正在尝试向ExpandoObject添加属性,并且需要将PropertyInfo结构传递回另一个例程。

代码语言:javascript
复制
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?我显然不明白,但我已经盯着它看了一天了,我什么也没有得到。谢天谢地接受了所有的帮助/批评!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-31 13:42:48

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

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

代码语言:javascript
复制
dynamic exp = new ExpandoObject();
exp.A = "123";

实际调用相当复杂,涉及DLR,但其效果与写入相同。

代码语言:javascript
复制
((IDictionary<string, object>)exp)["A"] = "123";

这也只能在使用dynamic时起作用。以上代码的强类型版本将导致编译时错误。

代码语言:javascript
复制
var exp = new ExpandoObject();
exp.A = "123"; // compile-time error

ExpandoObject的实际实现可以找到这里

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32312207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档