如何重写动态对象属性的 get 访问器

2023-12-03

假设我有以下课程:

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";

但这就是我被困住的地方。我怎样才能覆盖get新的访问者FullName财产?

我可以通过创建新方法来达到相同的效果:

person.GetFullName = (Func<string>)(() => {
      return person.Name + " " + person.Surname;
});

但这最终会得到一个方法而不是一个属性,因此这样调用它:

person.GetFullName();

EDIT

请注意,我不想知道如何定义或创建新的动态属性。我想知道如何重写或定义动态属性的 get 访问器。

我想象代码可能是这样的:

person.FullName.get = (Func<string>)(() => {
     return person.Name + " " + person.Surname;
});

然后,像这样调用:

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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重写动态对象属性的 get 访问器 的相关文章

随机推荐

  • C 中的函数指针如何工作?

    我最近对 C 中的函数指针有了一些经验 因此 按照回答自己问题的传统 我决定对基础知识做一个小总结 供那些需要快速深入了解该主题的人使用 C 中的函数指针 让我们从一个基本函数开始指向 int addInt int n int m retu
  • 如何创建表 AWS Athena --> 映射 Json 数组?

    如何为 Json 数组格式创建表 Athena AWS JSON 格式示例 Tapes Status AVAILABLE Used 0 0 Barcode TEST1217F7 Gateway Test Report UsedGB 0 0
  • 将 ASP.NET MVC 5 从 .NET 4.5 降级到 4.0

    坐着面对一个有趣的问题 服务器不支持 NET 4 5 客户端没有提到这一点 但该应用程序是使用 ASP NET MVC 5 编写的 仅在 NET 4 5 上运行 所以降级dot net就意味着降级ASP NET MVC版本 我们遇到的许多错
  • 展开转场不触发

    我学习得很快 并为我的大部分应用程序奠定了基础 我有以下故事板 应用故事板 一切正常 例如 我在添加课程视图控制器上有一个展开转场 当您按下 保存 并且您返回到 您的课程 视图控制器时 该控制器会触发 当您在我的课程视图控制器上时 您可以选
  • Checkedtextview 滚动Listview后选中/取消选中

    我正在使用 viewHolder 和 getview 在 listvew 中开发 checktextview 填充检查 取消检查状态绑定从数据库运行良好 但是 如果我选中项目然后滚动列表视图 它将返回取消选中 这是我的自定义适配器代码 pu
  • SQLite 存储、检索和比较 DATETIME 字段

    我真的很难在 Objective C 中比较 SQLite 查询中的日期 这就是我正在做的事情 存储日期 这个文件告诉我使用下面指定的日期格式 但它似乎不正确 我尝试使用yyyy MM dd hh mm ss但也没有成功 NSDate to
  • 堆栈中的 Activity 过多会使应用程序变得非常慢

    最近我创建了一个社交应用程序 我没有使用fragment 项目快完成了 我有几个活动 例如用户配置文件 关注者 关注者活动 通常情况下它工作得很好 但是 如果用户单击 UserA UserProfile 活动 gt 然后单击 A 的关注者
  • MDN 示例中不必要使用 calc()?

    我刚刚读了 CSS 函数calc 在 Mozilla 的开发者网络中 第一个例子在本文使用以下 CSS 代码 banner position absolute left calc 40px width calc 100 80px borde
  • 受二次约束的线性目标最大化

    我有一篇论文中的编程公式 想给它一个解决特定问题的工具 作者将其描述为线性规划 LP 实例 但我不确定 公式有点像如下 max x1 x2 x3 s t x1 x3 x4 x5 lt 10 x2 x5 x3 x7 x1 x9 lt 10 我
  • Tensorflow 2.3:AttributeError:“Tensor”对象没有属性“numpy”

    我想加载借用的文本文件here 其中每一行代表一个 json 字符串 如下所示 overall 2 0 verified true reviewTime 02 4 2014 reviewerID A1M117A53LEI8 asin 750
  • Web请求标头的顺序重要吗?

    我正在发出 POST 请求以将图片上传到网站 页面中有一个FileUpload和一个input textBox 在fiddler中我发现页面正在使用Multipart Post请求模式发送一些数据 Content Disposition m
  • CloudWatch 警报:待确认

    我使用 CloudFormation 模板创建了一个 CW 警报 如下所示 MyAlarm Type AWS CloudWatch Alarm DependsOn CodePipelineSNSTopic Properties Action
  • 如何配置nextjs 9和ant design less的兼容性?

    升级后react react dom and nextjs发生此错误 发生构建错误 home lenovo node modules antd lib style index css 7 身体 语法错误 意外的标记 在 Module com
  • ASP.NET 全局错误处理程序中的 WebMethod:如何捕获 AJAX POST 请求中传递的值

    换句话说 使用 HttpContext 我如何检索传递给 WebMethod 什么时候在全局错误处理程序中 Kovu 给出了一个很好的例子如何做一个全局错误陷阱来抓取 WebMethod Global asax 中的错误 我认为他是从那里得
  • 指针变量,var 和 &var 的区别

    include
  • Heroku:将 Rails 应用程序推送到 Heroku 时出错,Heroku 找不到 Rails 应用程序

    我正在尝试将 Rails 应用程序推送到 Heroku 但是我不断收到此错误 user git push heroku master Initializing repository done Counting objects 158 don
  • Python列表理解:列出没有重复项的子项

    我正在尝试打印列表中所有单词中的所有字母 不重复 我试过 gt gt gt wordlist cat dog rabbit gt gt gt letterlist gt gt gt letterlist append x for x in
  • iOS中随机显示字符串而不重复它们

    我正在制作一个测验应用程序 该应用程序使用 json 文件作为问题和答案的 数据库 这个 json 文件如下所示 id 1 question Earth is a answers Planet Meteor Star Asteroid di
  • 访问新窗口 - cypress.io

    问题就这么简单 在 Cypress 中 如何访问运行测试时打开的新窗口 重新创建的步骤 运行测试 进行一些操作后 会弹出新窗口 URL 本质上是动态的 填写新窗口中的字段 然后单击几个按钮 在新窗口中完成所需操作后 关闭新窗口并返回主窗口
  • 如何重写动态对象属性的 get 访问器

    假设我有以下课程 public class Person public string Name get set public string Surname get set public string FullName get return