首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >向ExpandoObject添加未知(在设计时)属性

向ExpandoObject添加未知(在设计时)属性
EN

Stack Overflow用户
提问于 2010-06-04 20:22:09
回答 4查看 20.2K关注 0票数 51

我只是在探索c# 4,试图弄明白所有这些动态的东西。抱歉,如果这个问题是愚蠢的,在这个领域没有经验。

如果我有一个ExpandoObject,并且想要在运行时给它添加公共属性(使用get和set),我该怎么做呢?

例如,我有一个documentTemplate和一个文档,其中有一个指向documentTemplate的属性。这个documentTemplate有一些标签标题(例如,在学生中培养的能力),在制作文档时应该解决这些问题(例如,专注力、记忆力等)。因此,一旦在文档中设置了模板,我就想创建一个类,该类具有与模板中的标记标题同名的属性,然后使用一些UI元素,例如PropertyGrid,我可以让用户根据标记标题填充标记值。

感谢您的阅读!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-22 13:57:09

我想知道如何才能“即时”地将成员添加到类中,并想出了这个示例:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Dynamic;

class Program
{
    static void Main()
    {
        dynamic expando = new ExpandoObject();
        var p = expando as IDictionary<String, object>;

        p["A"] = "New val 1";
        p["B"] = "New val 2";

        Console.WriteLine(expando.A);
        Console.WriteLine(expando.B);
    }
}

这段代码的要点是,成员A和B在中被定义为字符串文字(硬编码/字符串化),并通过ExpandoObject的IDictionary接口添加。我们通过直接访问它们并将其输出到控制台来测试密钥的存在和值(并证明概念)。

票数 101
EN

Stack Overflow用户

发布于 2010-06-04 22:00:10

可以向ExpandoObject添加委托属性,然后这些属性的行为(几乎)就像方法一样。例如,

代码语言:javascript
复制
dynamic obj = new ExpandoObject();
obj.GetDocumentTemplate = () => { ... };
...
obj.GetDocumentTemplate(); // invokes delegate
票数 4
EN

Stack Overflow用户

发布于 2010-06-04 21:39:24

是的,ExpandoObject在很大程度上是为了将属性动态添加到“属性包”中。但是,不支持为这样的属性提供getter和setter的概念。如果你仔细考虑一下,这一点可能会很清楚:如果你已经知道getter和setter应该做什么,它就不再是一个动态属性了。您能得到的最接近的方法是实现INotifyPropertyChanged事件,这样您就可以检测到更改。一些示例代码:

代码语言:javascript
复制
using System;
using System.Dynamic;
using System.ComponentModel;

class Program {
  static void Main(string[] args) {
    dynamic obj = new ExpandoObject();
    obj.test = 42;     // Add a property
    Console.WriteLine(obj.test);

    var inpc = (INotifyPropertyChanged)obj;
    inpc.PropertyChanged += inpc_PropertyChanged;
    obj.test = "foo";
    Console.ReadLine();
  }

  static void inpc_PropertyChanged(object sender, PropertyChangedEventArgs e) {
    Console.WriteLine("'{0}' property changed", e.PropertyName);
  }

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

https://stackoverflow.com/questions/2974008

复制
相关文章

相似问题

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