将未知(在设计时)属性添加到ExpandoObject

时间:2010-06-04 12:22:09

标签: c# c#-4.0

只是探索c#4。试着了解所有这些动态的东西。很抱歉,如果这个问题很愚蠢,没有相关领域的经验。

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

例如,我有一个documentTemplate和一个文档,它有一个指向documentTemplate的属性。这个documentTemplate有一些标签标题(例如,学生之间开发的能力),应该在制作文件时解决(例如,集中,记忆等)。因此,只要在文档中设置模板,我想创建一个类,其具有与模板中的标签标题相同的属性,然后使用一些UI元素,例如PropertyGrid,我可以拥有该用户根据标签标题填写标记值。

感谢阅读!

5 个答案:

答案 0 :(得分:94)

我想知道如何“动态”将成员添加到课程中并提出这个样本:

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

答案 1 :(得分:4)

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

dynamic obj = new ExpandoObject();
obj.GetDocumentTemplate = () => { ... };
...
obj.GetDocumentTemplate(); // invokes delegate

答案 2 :(得分: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);
  }

}

答案 3 :(得分:2)

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

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

它介绍了使用动态XML输入动态创建和使用ExpandoObjects的一些示例。

答案 4 :(得分:2)

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

我仍然需要更多的创造力来找出这可能有用的东西。在UI上创建动态对象?听起来很酷:D我会试试看。