咨询区

  • Leo Vo

我有下面一段代码:

var output = new
{NetSessionId = string.Empty
};foreach (var property in output.GetType().GetProperties())
{property.SetValue(output, "Test", null);
}

代码运行后,它会抛出如下异常:

Property set method not found

我想知道如何给这个 匿名类型 的属性赋值?

回答区

  • Alex

从 MSDN :https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/types/anonymous-types 的描述来看,理论上 匿名类型 是不可变的,一旦定义好之后,你是无法对它重新赋值。

但我想提醒的是,其实并没有所谓永恒的不可变,你要是真想变,肯定是有办法的,比如下面的 匿名类

var myAnonInstance = new{FirstField = "Hello",AnotherField = 30,};

当你用 ILSpy 反编译后代码如下:

internal sealed class <>f__AnonymousType0<<FirstField>j__TPar, <AnotherField>j__TPar>{[DebuggerBrowsable(DebuggerBrowsableState.Never)]private readonly <FirstField>j__TPar<FirstField> i__Field;[DebuggerBrowsable(DebuggerBrowsableState.Never)]private readonly <AnotherField>j__TPar<AnotherField> i__Field;public <FirstField>j__TPar FirstField{get{return < FirstField > i__Field;}}public <AnotherField>j__TPar AnotherField{get{return < AnotherField > i__Field;}}}

可以看到,底层的字段其实是有默认规范的: <xxxxx>i__Field, 这里的 xxxxx 就是属性名字,接下来就可以用 反射 来修改背后的字段即可,参考代码如下:

public static class AnonymousObjectMutator
{private const BindingFlags FieldFlags = BindingFlags.NonPublic | BindingFlags.Instance;private static readonly string[] BackingFieldFormats = { "<{0}>i__Field", "<{0}>" };public static T Set<T, TProperty>(this T instance,Expression<Func<T, TProperty>> propExpression,TProperty newValue) where T : class{var pi = (propExpression.Body as MemberExpression).Member;var backingFieldNames = BackingFieldFormats.Select(x => string.Format(x, pi.Name)).ToList();var fi = typeof(T).GetFields(FieldFlags).FirstOrDefault(f => backingFieldNames.Contains(f.Name));if (fi == null)throw new NotSupportedException(string.Format("Cannot find backing field for {0}", pi.Name));fi.SetValue(instance, newValue);return instance;}
}

然后你可以这样使用。

public static void Main(params string[] args)
{var myAnonInstance = new { FirstField = "Hello", AnotherField = 30, };Console.WriteLine(myAnonInstance);myAnonInstance.Set(x => x.FirstField, "Hello SO").Set(x => x.AnotherField, 42);Console.WriteLine(myAnonInstance);
}

输出结果:

{ FirstField = Hello, AnotherField = 30 }
{ FirstField = Hello SO, AnotherField = 42 }

点评区

这个题目其实很有意思,虽然语言和框架设计者用了各种限制来阻止我们做一些事情,其实都有化解的方法,所以并没有永恒的不可变,最彻底的还可以通过修改内存地址变更,不是嘛~

如何修改 匿名类型 中的属性值 ?相关推荐

  1. js 修改数组对象中的属性值

    数据类型如下: var dataType=[{"type":"add",state":false},{"type":"u ...

  2. 微信小程序如何实现通过js修改wxml的for循环中的属性值

    微信小程序如何实现通过js修改wxml的for循环中的属性值 要实现的效果 具体代码 要实现的效果 点击每一个活动选项,实现显示对应的操作按钮 具体代码 首先要在对应页面的js中给data中定义数组, ...

  3. Java:比较两个对象中全部属性值是否相等

    点击关注公众号,实用技术文章及时了解 来源:xiaoer.blog.csdn.net/article/details/85005295 例如下述Java类: import java.io.Serial ...

  4. springboot log4j2.xml读取application.yml中的属性值

    注意:部份代码太长,可以通过文末的图片快速查看对应位置 项目需求 用户想自己配置日志存放的位置,因此我们需要满足提供可以配置的文件,用以满足用户的需求. 因此,我们主要通过 log4j2.xml 来读 ...

  5. SpringMVC js如何获取后台model中的属性值

    SpringMVC js如何获取后台model中的属性值 companylist 如何获取 var companylist="${companylist}"; 希望对你有所帮助 个 ...

  6. golang修改结构体中的切片值

    golang修改结构体中的切片值,直接传结构体地址就可以 package mainimport "fmt"type rspInfo struct {KeyWords string ...

  7. go在方法中修改结构体的值_golang修改结构体中的切片值方法

    golang修改结构体中的切片值方法,结构,切片,站长站,文章,相关文章 golang修改结构体中的切片值方法 易采站长站,站长之家为您整理了golang修改结构体中的切片值方法的相关内容. gola ...

  8. s:property=a value=/取的s:debug/s:debug中的value stack中的属性值

    <s:property="a"  value=""/>取的<s:debug></s:debug>中的value stack中 ...

  9. 在jsp中调用常量类中的属性值

    在jsp中想要调用常量类中的属性值方法: 1.  在jsp中导入此常量类   <%@page import="com.Zyp.constant.FlagConstant"%& ...

最新文章

  1. bzoj3295:[CQOI2011]动态逆序对
  2. centos6.5环境下zookeeper-3.4.6集群环境部署及单机部署详解
  3. 英语语法---数词详解
  4. 4.QT中进程操作,线程操作
  5. HDU - 3538 A sample Hamilton path(最短哈密顿路径+状压dp)
  6. 我如何预测10场英超联赛的确切结果
  7. Google Jump Consistent Hash 一致性哈希算法
  8. 《物联网Android程序开发案例式教程》Demo1:线性布局
  9. 解决ajaxSubmit无法传递自动回填和下拉框的数据
  10. Keil uVison4下载、安装、使用说明
  11. 2021-06-05 高效的wms仓储管理系统是关键
  12. Android 利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)
  13. 2017科协青少年科技中心--中央电教馆(与科技相关的比赛)
  14. python表情换头_使用Python制作表情包实现换脸功能
  15. 织梦网站搬家流程揭秘
  16. java和vue视频点播弹幕系统
  17. 关于在js中使用trim函数的一些小技巧
  18. for循环canvas渲染图片
  19. 如何注册msn.com的信箱
  20. 基于MPPT算法的PV光伏阵列电网模型simulink仿真

热门文章

  1. 怎么快速了解自己的MySQL服务器?
  2. 解决php连接mysql数据库中文乱码问题
  3. NYOJ-45 棋盘覆盖
  4. ssh 与 locale
  5. session机制和cookie机制
  6. python中o_Python I/O与进程的详细讲解
  7. [USACO17JAN]Promotion Counting 题解
  8. MongoDB的安装与使用
  9. 程序员必须知道的HTML常用代码有哪些?
  10. E20171214-sl