【发布时间】:2015-07-07 12:45:36
【问题描述】:
假设我有以下课程:
public class Person {
public string Name { get; set; }
public string Surname { get; set; }
public string FullName {
get {
return Name + " " + Surname;
}
}
}
以下块:
Person person = new Person();
person.Name = "Matt";
person.Surname = "Smith";
return person.FullName;
将返回Matt Smith。
让我们将Person 类型更改为动态ExpandoObject。
代码如下所示:
dynamic person = new ExpandoObject();
person.Name = "Matt";
person.Surname = "Smith";
但这就是我卡住的地方。如何覆盖新 FullName 属性的 get 访问器?
我可以创建一个新方法来达到同样的效果:
person.GetFullName = (Func<string>)(() => {
return person.Name + " " + person.Surname;
});
但这最终会是一个方法而不是一个属性,因此这样称呼它:
person.GetFullName();
编辑
请注意,我不想知道如何定义或创建新的动态属性。我想知道如何覆盖或定义动态属性的 get 访问器。
我想象的代码可以是这样的:
person.FullName.get = (Func<string>)(() => {
return person.Name + " " + person.Surname;
});
然后,像这样调用:
Console.WriteLine(person.FullName); //Prints out "Matt Smith"
【问题讨论】:
-
@MethodMan 我已经看过了,但我无法找到解决方案。请指导一下好吗?
-
@Clint 我不是在问如何动态添加属性。我在问如何覆盖动态添加的属性的获取访问器行为
-
@MatiCicero 这可以通过从 DynamicObject 派生来完成,并显示在该问题的答案中。