如何重写动态对象的属性的get访问器 [英] How to override get accessor of a dynamic object's property
问题描述
假设我有以下课程:
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
。
Let's change our Person
type to a dynamic ExpandoObject
.
代码如下:
dynamic person = new ExpandoObject();
person.Name = "Matt";
person.Surname = "Smith";
但是这里就是我被困住的地方。如何覆盖新 FullName
属性的 get
访问器?
But here's where I am stuck. How can I override the get
accessor of a new FullName
property?
我可以通过创建新方法来达到相同的效果:
I could achieve the same effect creating a new method:
person.GetFullName = (Func<string>)(() => {
return person.Name + " " + person.Surname;
});
但这最终会以方法而不是属性来结束,因此将其称为:
But this would end up with a method and not a property, therefore calling it like:
person.GetFullName();
EDIT
请注意,我不想知道如何定义或创建新的动态属性。我想知道如何覆盖或定义动态属性的get访问器。
EDIT
Please note that I do not want to know how to define or create a new dynamic property. I would like to know how to override or define a get accessor for a dynamic property.
我认为代码可以是这样的:
I picture the code can be something like this:
person.FullName.get = (Func<string>)(() => {
return person.Name + " " + person.Surname;
});
然后,按如下方式调用:
Then, invoked like this:
Console.WriteLine(person.FullName); //Prints out "Matt Smith"
推荐答案
dynamic person = new GetterExpando();
person.Name = "Matt";
person.Surname = "Smith";
person.FullName = new GetterExpando.Getter(x => x.Name + " " + x.Surname);
Console.WriteLine(person.FullName); // Matt Smith
// ...
public sealed class GetterExpando : DynamicObject
{
private readonly Dictionary<string, object> _data = new Dictionary<string, object>();
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_data[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
object value;
if (_data.TryGetValue(binder.Name, out value))
{
var getter = value as Getter;
result = (getter == null) ? value : getter(this);
return true;
}
return base.TryGetMember(binder, out result);
}
public delegate object Getter(dynamic target);
}
这篇关于如何重写动态对象的属性的get访问器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!