我只是在探索c# 4,试图弄明白所有这些动态的东西。抱歉,如果这个问题是愚蠢的,在这个领域没有经验。
如果我有一个ExpandoObject,并且想要在运行时给它添加公共属性(使用get和set),我该怎么做呢?
例如,我有一个documentTemplate和一个文档,其中有一个指向documentTemplate的属性。这个documentTemplate有一些标签标题(例如,在学生中培养的能力),在制作文档时应该解决这些问题(例如,专注力、记忆力等)。因此,一旦在文档中设置了模板,我就想创建一个类,该类具有与模板中的标记标题同名的属性,然后使用一些UI元素,例如PropertyGrid,我可以让用户根据标记标题填充标记值。
感谢您的阅读!
发布于 2010-08-22 13:57:09
我想知道如何才能“即时”地将成员添加到类中,并想出了这个示例:
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-06-04 22:00:10
可以向ExpandoObject
添加委托属性,然后这些属性的行为(几乎)就像方法一样。例如,
dynamic obj = new ExpandoObject();
obj.GetDocumentTemplate = () => { ... };
...
obj.GetDocumentTemplate(); // invokes delegate
发布于 2010-06-04 21:39:24
是的,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);
}
}
https://stackoverflow.com/questions/2974008
复制相似问题