只是探索c#4。试着了解所有这些动态的东西。很抱歉,如果这个问题很愚蠢,没有相关领域的经验。
如果我有一个ExpandoObject并希望在运行时向它添加公共属性(使用get和set),我该怎么做呢?
例如,我有一个documentTemplate和一个文档,它有一个指向documentTemplate的属性。这个documentTemplate有一些标签标题(例如,学生之间开发的能力),应该在制作文件时解决(例如,集中,记忆等)。因此,只要在文档中设置模板,我想创建一个类,其具有与模板中的标签标题相同的属性,然后使用一些UI元素,例如PropertyGrid,我可以拥有该用户根据标签标题填写标记值。
感谢阅读!
答案 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我会试试看。