登峰造极境

  • WIN
    • CSharp
    • JAVA
    • OAM
    • DirectX
    • Emgucv
  • UNIX
    • FFmpeg
    • QT
    • Python
    • Opencv
    • Openwrt
    • Twisted
    • Design Patterns
    • Mysql
    • Mycat
    • MariaDB
    • Make
    • OAM
    • Supervisor
    • Nginx
    • KVM
    • Docker
    • OpenStack
  • WEB
    • ASP
    • Node.js
    • PHP
    • Directadmin
    • Openssl
    • Regex
  • APP
    • Android
  • AI
    • Algorithm
    • Deep Learning
    • Machine Learning
  • IOT
    • Device
    • MSP430
  • DIY
    • Algorithm
    • Design Patterns
    • MATH
    • X98 AIR 3G
    • Tucao
    • fun
  • LIFE
    • 美食
    • 关于我
  • LINKS
  • ME
Claves
长风破浪会有时,直挂云帆济沧海
  1. 首页
  2. 未分类
  3. 正文

dotnet动态获取属性值场景优化反射性能

2024-08-11

.使用 Type.GetProperties 获取属性信息
Type.GetProperties 方法会通过反射机制获取所有的公共属性。反射是一种强大的机制,但其开销相对较大。每次调用 GetProperties 时,都会扫描类型的元数据,并返回一个 PropertyInfo 数组,这个过程相对于直接访问属性要慢得多。
优化建议: 如果需要频繁访问属性,考虑将 PropertyInfo[] 缓存起来,而不是每次都调用 GetProperties。例如,可以在类初始化时获取属性信息并存储到一个静态或实例字段中,以减少反射调用次数。

  1. PropertyInfo.GetValue 获取属性值
    PropertyInfo.GetValue 方法同样通过反射来获取对象的属性值。反射获取属性值的速度比直接访问属性慢,因为它涉及到元数据解析和方法调用的额外开销。
    优化建议: 如果需要频繁获取属性值,可以考虑使用表达式树(Expression Tree)或动态方法(DynamicMethod)来生成委托,这样可以大幅提升性能。或者直接访问已知的属性而不是使用反射。
using System;
using System.Linq.Expressions;
using System.Reflection;

public class SystemInfoVO
{
    // 示例属性
    public string Property1 { get; set; }
    public int Property2 { get; set; }
}

public class OptimizedCode
{
    private static readonly PropertyInfo[] CachedProperties = typeof(SystemInfoVO).GetProperties();

    // 缓存委托数组
    private static readonly Func<SystemInfoVO, object>[] CachedGetters = CachedProperties
        .Select(CreateGetter)
        .ToArray();

    private static Func<SystemInfoVO, object> CreateGetter(PropertyInfo property)
    {
        var parameter = Expression.Parameter(typeof(SystemInfoVO), "x");
        var propertyAccess = Expression.Property(parameter, property);
        var convert = Expression.Convert(propertyAccess, typeof(object));
        return Expression.Lambda<Func<SystemInfoVO, object>>(convert, parameter).Compile();
    }

    public void RetrievePropertyValues(SystemInfoVO systemInfo)
    {
        for (int i = 0; i < CachedGetters.Length; i++)
        {
            var value = CachedGetters[i](systemInfo);
            // 执行一些操作
        }
    }
}
标签: 暂无
最后更新:2024-08-11

代号山岳

知之为知之 不知为不知

点赞
< 上一篇
下一篇 >

COPYRIGHT © 2099 登峰造极境. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备14031139号-5

川公网安备51012202000587号