• 快速动态访问属性


        public static class EmitDynamicProperty
        {
            private static ConcurrentDictionary<string, Delegate> action = new ConcurrentDictionary<string, Delegate>();
            public static TRet DynamicGetProperty<TRet>(this object obj, string propertyName)
            {
                var type = obj.GetType();
                string key = string.Concat(type.FullName, "_", propertyName);
                var gater = action.GetOrAdd(key, k =>
                {
                    var method = type.GetProperty(propertyName).GetGetMethod();
    
                    var dynamicMethod = new DynamicMethod(string.Empty, typeof(TRet), new Type[] { typeof(object) });
    
                    var ilGen = dynamicMethod.GetILGenerator();
                    ilGen.Emit(OpCodes.Ldarg_0);
                    ilGen.Emit(OpCodes.Castclass, type);
                    ilGen.Emit(OpCodes.Callvirt, method);
                    if (method.ReturnType.IsValueType && (!typeof(TRet).IsValueType))
                    {
                        ilGen.Emit(OpCodes.Box, method.ReturnType);
                    }
                    ilGen.Emit(OpCodes.Ret);
    
                    return dynamicMethod.CreateDelegate(typeof(Func<object, TRet>));
    
                });
    
                return ((Func<object, TRet>)gater)(obj);
    
            }
        }
    

      

    QQ:273352165 evlon#126.com 转载请注明出处。
  • 相关阅读:
    最近邻插值
    tp类型自动转换和自动完成
    tp读取器和写入器
    tp模型和数据库操作方法
    tp数据库操作
    tp请求和响应
    tp配置+路由+基本操作
    git的常见操作方法
    php 检查该数组有重复值
    公众号的TOKEN配置PHP代码
  • 原文地址:https://www.cnblogs.com/evlon/p/EmitDynamicProperty.html
Copyright © 2020-2023  润新知