如何重写动态对象的属性的get访问器 [英] How to override get accessor of a dynamic object's property

查看:139
本文介绍了如何重写动态对象的属性的get访问器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有以下课程:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆