51

只是探索 c# 4。试图了解所有这些动态的东西。对不起,如果这个问题很愚蠢,在这个领域没有经验。

如果我有一个 ExpandoObject 并且想在运行时向它添加公共属性(使用 get 和 set),我将如何去做呢?

例如,我有一个 documentTemplate 和一个 document,它有一个指向 documentTemplate 的属性。该文档模板有一些标签标题(例如,学生开发的能力),在制作文档时应该解决这些问题(例如,注意力,记忆力等)。所以一旦在文档中设置了模板,我想创建一个类,它的属性与模板中的标签标题名称相同,然后使用一些 UI 元素,例如 PropertyGrid,我可以让用户根据标签标题填写标签值。

谢谢阅读!

4

5 回答 5

101

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

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 接口添加。我们通过直接访问它们并输出到控制台来测试键的存在和值(并证明概念)。

于 2010-08-22T05:57:09.487 回答
4

可以将委托属性添加到ExpandoObject中,然后(几乎)就像方法一样。例如,

dynamic obj = new ExpandoObject();
obj.GetDocumentTemplate = () => { ... };
...
obj.GetDocumentTemplate(); // invokes delegate
于 2010-06-04T14:00:10.497 回答
3

是的,ExpandoObject 的设计目的是动态地将属性添加到“属性包”中。但是,不支持为此类属性提供 getter 和 setter 的概念。如果您稍微考虑一下,也许这很清楚:如果您已经知道 getter 和 setter 应该做什么,它就不再是动态属性了。您可以获得的最接近的是实现 INotifyPropertyChanged 事件,以便您可以检测更改。一些示例代码:

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);
  }

}
于 2010-06-04T13:39:23.867 回答
3

我刚刚发现了这个有趣的事实:XAML 绑定到 ExpandoObject 还将创建绑定尝试访问的属性

I still need more creativity to find out what this could be good for. Dynamic object creation on the UI? sounds cool :D I will try something out.

于 2011-08-04T17:32:37.200 回答
2

到目前为止的答案很好地涵盖了基础知识,但我觉得这篇 MSDN 杂志文章也值得分享:

http://msdn.microsoft.com/en-us/magazine/ff796227.aspx

它涵盖了一些使用动态 XML 输入来动态创建和使用 ExpandoObjects 的示例。

于 2010-11-04T19:44:02.080 回答