【问题标题】:Change property value of a C# Dynamic type [closed]更改 C# 动态类型的属性值 [关闭]
【发布时间】:2021-03-27 11:07:52
【问题描述】:

有没有办法改变动态类型的属性值? 代码示例:

dynamic result = new { Status = "WARNING", Modified = false, Message = string.Empty };
result.Status = "OK";

使用 C# 有可能吗? 谢谢

【问题讨论】:

  • 为什么不试试呢?
  • 好吧,我目前无法尝试,但是。例如,您是否尝试过简单的 result.Status="something"?
  • 试过了,尝试使用 PropertyInfo 但是 SetValue 在运行时失败。纳达

标签: c# .net object dynamic propertyinfo


【解决方案1】:

c# 4.0 中添加了动态数据类型。它用于避免编译时类型检查。编译器不会在编译时检查动态类型变量的类型,而是在运行时获取类型。

不过,在大多数情况下,动态数据类型的行为类似于对象。

在上述例子中: 您创建了一个类似于类类型的匿名类型变量,但它只能包含公共只读成员,因此在这种情况下您无法更改 result.Status 值。

解决问题:


我认为你应该使用像字典这样的通用集合 代码可能如下所示:

var result = new Dictionary<string, object>() { {"Status", "Warning"}, {"Modified", false}, {"Message", string.empty} };

result ["Status"] = "Ok";

【讨论】:

  • 好的,语法上它可以工作。然后我需要使用return Json(result) 将result 作为Json 返回。有什么办法可以投射 Dictionary&lt;string, object&gt;() 让它返回正确的 Json 吗?这样它返回 key.value 元组的 Json 数组。
【解决方案2】:

不,这是不可能的。您将收到一个运行时错误,告诉您匿名类型的属性Status 是写保护或只读的。

这里是online compiler proof:

documentation 说:

匿名类型包含一个或多个公共只读属性。

对于其余属性,您需要使用原始对象中的值再次重新创建对象:

var result = new { Status = "WARNING", Modified = false, Message = string.Empty };
result = new { Status = "OK", Modified = result.Modified, Message = result.Message };
Console.WriteLine(result.Status);

输出:

好的

【讨论】:

    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 2017-03-04
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2019-08-11
    相关资源
    最近更新 更多