首页
学习
活动
专区
圈层
工具
发布

C# 中的高性能动态属性访问方法

在C#编程中,动态访问对象属性是一项常见需求,尤其在构建灵活且可扩展的应用程序时更是如此。设想一下,你正在开发一个需要处理许多不同对象类型的系统,而且这些对象的属性可能会随着需求的变化而改变。...反射是C#中的一项强大功能,它允许你在运行时检查、访问以及修改对象的类型和成员(包括属性)。...propertyInfo = type.GetProperty("Name"); string name =(string)propertyInfo.GetValue(person);...propertyInfo = ReflectionCache.GetPropertyInfo(person,"Name"); string name =(string)propertyInfo.GetValue...这种方法结合了编译时的安全性和运行时的性能,使其成为动态属性访问的最佳实践之一。 在C#中动态访问对象属性是一项强大的功能,但如果不进行优化,可能会导致显著的性能损失。

76610

【干货】C#根据类生成签名字符串(附DEMO下载地址)

,这次我们写一个C#把类结构生成的签名字符串。...的List ListPropertyInfo> proplist = new ListPropertyInfo>(); //遍历泛型类的每个属性加入到List里面...,所以我们用到了泛形,要读取每个类的属性和值我们又用到了PropertyInfo(这个的用法我们就不在这介绍了,大家可以搜一下),其实 PropertyInfo里的Name就是我们的类里属性的名称,GetValue...代码里的实现步骤: 定义生成的ListPropertyInfo>(new ListPropertyInfo>()) 把传入进来的泛型类的属性生数组,然后再插入到我们的List里面(List.add(...)) 根据输入的参数进行List属性名的排序(List.Orderby()) 遍历我们的Listr属性和值进行字符串的拼接(List.Foreach()) 输出字符串 代码编写 我们新建好一个C#的Winform

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    探究 C# dynamic动态类型本质

    前言 在做接口动态传参的时候思考了个问题:如何把一个json字符串,转成C#动态类?...[] pi = t.GetProperties(); foreach (PropertyInfo p in pi) { var key = p.Name; var value = p.GetValue...我们对obj2运行同样的代码,发现会报错 Type t = obj2.GetType(); PropertyInfo[] pi = t.GetProperties(); foreach (PropertyInfo...+ ": " + value); } 报错的原因是obj2并不包含真正的userId成员变量,因为其本质是个ExpandoObject对象, 可见dynamic关键字并不会改变C#变量在运行时的类型...毕竟C#不能像其他弱类型语言那样使用。 obj1匿名类的成员变量是只读的。给它赋一个其他类型的值,将会报错;而给obj2的成员变量赋其他类型的值,则不会报错。

    49730

    C# 解析 sln 文件 使用

    原先使用的方法dte.Solution.Projects但是放在文件夹的项目获取不到,所以使用堆栈提供的方法。 首先添加引用 Microsoft.Build 注意版本 ?...// s_SolutionParser_projects.GetValue(solutionParser, null); //PropertyInfo...用反射获得解析 sln 的 s_SolutionParser_parseSolution 他可以获得所有项目。 但是获得的项目路径是相对的,于是使用C# 相对路径转绝对路径,可以转换项目路径。...使用 输入工程文件名就好,输入工程名,会自动获得所有项目。...欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    1.6K00

    C#dynamic动态类型本质探究

    前言 在做接口动态传参的时候思考了个问题:如何把一个json字符串,转成C#动态类?...[] pi = t.GetProperties(); foreach (PropertyInfo p in pi) { var key = p.Name; var value = p.GetValue...我们对obj2运行同样的代码,发现会报错 Type t = obj2.GetType(); PropertyInfo[] pi = t.GetProperties(); foreach (PropertyInfo...+ ": " + value); } 报错的原因是obj2并不包含真正的userId成员变量,因为其本质是个ExpandoObject对象, 可见dynamic关键字并不会改变C#变量在运行时的类型...毕竟C#不能像其他弱类型语言那样使用。 obj1匿名类的成员变量是只读的。给它赋一个其他类型的值,将会报错;而给obj2的成员变量赋其他类型的值,则不会报错。

    74730

    如何把一个json字符串,转成C#动态类?

    本周在做接口动态传参的时候思考了个问题:如何把一个json字符串,转成C#动态类?...[] pi = t.GetProperties(); foreach (PropertyInfo p in pi) { var key = p.Name; var value = p.GetValue...我们对obj2运行同样的代码,发现会报错 Type t = obj2.GetType(); PropertyInfo[] pi = t.GetProperties(); foreach (PropertyInfo...": " + value); } 报错的原因是obj2并不包含真正的userId成员变量,因为其本质是个ExpandoObject对象,可见dynamic关键字并不会改变C#变量在运行时的类型,它仅仅是在编译阶段跳过了静态类型检查...毕竟C#不能像其他弱类型语言那样使用。 obj1匿名类的成员变量是只读的。给它赋一个其他类型的值,将会报错; 而给obj2的成员变量赋其他类型的值,则不会报错。

    66420

    C# 使用反射获取私有属性的方法

    是使用 string 作为属性的类,可以通过创建委托的方式提高性能。...,在下面我测试了不同的方法的性能 测试 首先是通过 GetValue 的方式经过 1 次 和 100 次运行,测试方法都是通过C# 标准性能测试 但是在测试完成需要告诉大家结论 使用 GetValue...没有使用缓存的方法,而缓存也只是缓存 PropertyInfo 的值,于是在下面测试 GetGetMethod 的方法,这个方法在跑100次就添加了缓存 public void GetPropertyGetAccessorMethodInfo_Call100...没有带缓存的 GetGetMethod 带缓存的性能是 GetValue 的一倍,也就是找到 PropertyInfo 占用的时间如果能减少,就可以提高速度。...,而带缓存的调用和 GetGetMethod 的方法调用的时间几乎一样长 建议反射私有属性使用 GetValue 的方法,因为只要调用非公有属性,调用的时间就是这么长,无论通过表达式或其他方法都无法减少时间

    2.5K10

    C# 使用反射获取私有属性的方法 测试

    GetValue 最简单的方法直接调用 GetValue 的方法 var f = property.GetValue(foo); 这里的 f 就是属性 GetGetMethod...,在下面我测试了不同的方法的性能 测试 首先是通过 GetValue 的方式经过 1 次 和 100 次运行,测试方法都是通过C# 标准性能测试 但是在测试完成需要告诉大家结论 使用 GetValue...没有使用缓存的方法,而缓存也只是缓存 PropertyInfo 的值,于是在下面测试 GetGetMethod 的方法,这个方法在跑100次就添加了缓存 public void GetPropertyGetAccessorMethodInfo_Call100...没有带缓存的 GetGetMethod 带缓存的性能是 GetValue 的一倍,也就是找到 PropertyInfo 占用的时间如果能减少,就可以提高速度。...,而带缓存的调用和 GetGetMethod 的方法调用的时间几乎一样长 建议反射私有属性使用 GetValue 的方法,因为只要调用非公有属性,调用的时间就是这么长,无论通过表达式或其他方法都无法减少时间

    2.9K20

    C#中的反射解析及使用.

    1、对C#反射机制的理解 2、概念理解后,必须找到方法去完成,给出管理的主要语法 3、最终给出实用的例子,反射出来dll中的方法 参考: C#反射,MSDN编程指南 反射是一个程序集发现及运行的过程,通过反射可以得到...,输入值为null代表没有参数 四、反射属性 1.通过 System.Reflection.PropertyInfo 能查找到类里面的属性    常用的方法有GetValue(object,object...propertyInfo=obj.GetProperty("Name"); //获取Name属性对象 5 var name=propertyInfo.GetValue(obj,null);...; 总结: Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的区别 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系...,一般情况下都应该优先使用 这个方法,他的执行效率比LoadFrom要高很多,而且不会造成重复加载的问题(原因在第2点上说明)     使用这个方法的时候, CLR会应用一定的策略来查找程序集,实际上CLR

    2.6K140

    xBIM 高级02 插入复制功能

    要正确使用它,你需要非常好地理解IFC的结构。下面是一个强大的转换的简单示例,它将忽略所有的几何图形和位置,只允许描述产品类型及其属性的逆关系。...几何图形通常占文件的90%左右,因此如果您对基于几何图形的图形或分析不感兴趣,可以使用它创建仅包含描述性数据的非常小的IFC文件。...) )) return null; return property.PropertyInfo.GetValue(parentObject, null); };...ExpressMetaProperty 是一个缓存对象,它是我们自己反射元模型的一部分,我们用于某些数据操作。该委托在其他代码中使用,这些代码使用C#反射来检查数据并复制值。...return null; return property.PropertyInfo.GetValue(parentObject, null);

    79310

    C#反射与特性(七):自定义特性以及应用

    从前面我们知道,通过反射可以获取到属性 PropertyInfo 、字段 FieldInfo,在《C#反射与特性(三):反射类型的成员》的 1.2 获取属性、字段成员中,有详细介绍。...PropertyInfo 中的 GetValue()和 SetValue() 可以获得或者设置 实例属性和字段的值。...那些 Type 、PropertyInfo 都是对元数据的读取,只能读,只有实例才能对程序产生影响。...2.1 特性规范和自定义特性 C# 中,预定义了三种特性类型: 名称 类型 说明 Conditional 位映射特性 可以映射到类型元数据的特定位上,public、abstract 以及 sealed...这里必须拿到三个参数: 实例化的对象:反射的基础是元数据,反射操作的基础是实例对象; 类型的属性 PropertyInfo :要通过 PropertyInfo 获取到实例对象的属性值; 特性对象 Attribute

    1.6K60

    结合使用 C# 和 Blazor 进行全栈开发

    Blazor 是将 C# 引入浏览器的 Microsoft 试验框架,正好可以填补欠缺的 C# 一环。...在浏览器中运行的 Blazor Web 应用程序可以与 C# 后端服务器共享代码。可以将逻辑放入共享库中,并在前端和后端使用它。这会带来很多好处。...> 0) { return true; } return false; } 值和事件 是时候添加 GetValue 方法了,它需要使用 fieldname 参数,并使用反射来查找此模型中的字段并返回字段值...Blazor 客户端使用此方法来检索当前值,并在输入框中显示它,如下所示: public String GetValue(String fieldName) { var propertyInfo =...Blazor 的神奇之处在于,使用它,现有 C# 开发人员大军可以生成功能强大的新式响应式单页应用程序,且最大限度地缩短启动时间。

    8.3K40

    C#反射与特性(八):反射操作的示例大全

    GetAccessors 微信平台,此文仅授权《NCC 开源社区》订阅号发布】 《C# 反射与特性》已经完成了七篇,讲解了反射的使用和实践应用,第六和第七篇对反射特性等进行了实践总结练习,学习完毕后,可以对一般的实际场景进行应用...前面我们使用 MemberInfo 来获取类型的成员并进行操作,也使用了 PropertyInfo 、MethodInfo 等,我们使用到的成员,都是公开成员。...BindingFlags.DeclaredOnly 仅搜索类型上声明的成员,而不搜索继承的成员。 关于 DeclaredOnly ,可以参考《C#反射与特性(五):类型成员操作》中的 1.4 小节。...1.2 实践使用 InvokeMember 和成员的重载方法 本节介绍 InvokeMember 的用法以及 MethodInfo 、PropertyInfo 等使用 BindingFlags 的重载方法...1.2.11 属性的 GetGetMethod() 和 SetGetMethod() 上面获取到私有属性的 PropertyInfo 后,通过 SetValue 设置值和 GetValue 获取值。

    1.8K61

    解决Entity Framework查询匿名对象后的跨域访问的一种方式

    在Entity Framework中,可以使用lambda表达式进行对数据的查询,而且可以将查询结果直接映射为对象或者对象列表,这极大的提高的开发速度,并且使数据层的数据更加方便处理和传递。...但是很多时候,我们不需要把整个表的字段都查出来,如果我们直接把整个数据实体查询出来,就极大的影响了性能,所以我们需要通过查询匿名对象或者已经定义的方式,对数据库进行查询; 1.实例使用的数据实体类: public...3.目前为止我所知的最好的跨域访问方式 在c#4.0中,加入了dynamic特性,这使得我们可以使用它支持对动态类型的解释,虽然c#语言绝对是静态类型的,但是dynamic通过在编译的时候,不推断出具体类型...,而是展开为表达式数的形式,在最后执行期间使用代理去执行调用的方法,是对匿名类型的调用比使用反射机制更加高效便捷了,所以,对于上述实例,可以使用如下方式进行调用: foreach (dynamic item...UI层链接的服务层,我仍然推荐使用查询ViewModel的方式

    1K30

    C# 基础知识系列- 5 反射和泛型

    使用 做标记,中间写类型,表示这是一个泛型为XXX的泛型类。通常与其他语言不同的地方是,C#的泛型支持所有类型,意思就是在没有额外声明的时候,可以使用任意类型作为泛型参数传递。...在C#中常见的有如下两个方法: 使用typeof 关键字 Type personType = typeof(Person); 通过对象,使用GetType 方法 Person person = new...第二条:该方法会返回一个类型为PropertyInfo[] 的数组,这个数组里包含着所有使用public声明的属性。...使用PropertyInfo动态操作一个对象的属性值 我们通过上一小节获取到了一个类的属性PropertyInfo,现在可以利用这个属性进行后续的操作: Person person = new Person...同理,可以很轻易的联想到如果只有set,那么GetValue也会报错,与之相对应的就是prop.CanRead属性了。

    1.8K60

    win10 uwp 反射

    编译可以知道类型写错,反射不知道,可以得到错误的,一般使用反射需要小心,如果使用一些工具修改,那么反射得到的容易错误,好在C# 6有 name of 可以获得一个属性或方法的名称,这样使用他进行反射,得到的值才不容易出错...C# 反射私有构造方法创建,下面来告诉大家如何写 首先需要获得构造函数,如果构造函数不是 public 那么就需要使用下面代码获得 获得方法 获得类型方法 MethodInfo[] listMethodInfo...获得属性 object obj =Activator.CreateInstance(type); PropertyInfo propertyInfo = obj.GetProperty("...Name"); //获取Name属性对象 var name = propertyInfo.GetValue(obj,null); //获取Name属性的值 propertyInfo.SetValue...参见: 在C#中判断某个类是否实现了某个接口 性能 但是不管怎么说,反射都是伤性能 ? ?

    1.5K20
    领券