zoukankan      html  css  js  c++  java
  • PropertyAccess类 Linq.Expressions 实现

    public class PropertyAccess
    {
    public const BindingFlags PropertyBinding = BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty
    //| BindingFlags.DeclaredOnly
    ;

    public readonly Func<object, object> GetValue;
    public readonly Action<object, object> SetValue;

    protected PropertyAccess(string name, bool nullable, PropertyInfo property)
    {
    // target: (object)((({TargetType})instance).{Property})
    // preparing parameter, object type
    ParameterExpression instance = Expression.Parameter(typeof(object), "instance");
    // ({TargetType})instance
    UnaryExpression instanceCast = Expression.Convert(instance, property.ReflectedType);
    if (property.CanRead)
    {
    // (({TargetType})instance).{Property}
    MemberExpression propertyAccess = Expression.Property(instanceCast, property);
    // (object)((({TargetType})instance).{Property})
    UnaryExpression castPropertyValue = Expression.Convert(propertyAccess, typeof(object));
    // Lambda expression
    GetValue = Expression.Lambda<Func<object, object>>(castPropertyValue, instance).Compile();
    }
    if (property.CanWrite)
    {
    ParameterExpression propertyValue
    = Expression.Parameter(typeof(object), "value");
    UnaryExpression propertyValueCast
    = Expression.Convert(propertyValue, property.PropertyType);
    MethodCallExpression callPropertyValue
    = Expression.Call(instanceCast, property.GetSetMethod(), propertyValueCast);
    SetValue
    = Expression.Lambda<Action<object, object>>(callPropertyValue, instance, propertyValue).Compile();
    }
    }

    public object ChangeType(object value)
    {
    return Convert.ChangeType(value, Nullable.GetUnderlyingType(base.EntityProperty.PropertyType) ?? base.EntityProperty.PropertyType);
    }
    }
  • 相关阅读:
    Quartz2.0以上版本的单机和集群
    Mysql的Haproxy反向代理和负载均衡
    spring AOP原理解析
    Restful接口调用方法超详细总结
    mysql数据库主从同步
    数据备份的OSS接口
    读取properties配置文件的方法
    算法学习——堆排序(二叉树排序)
    回溯算法的实现
    冒泡排序
  • 原文地址:https://www.cnblogs.com/Googler/p/2000145.html
Copyright © 2011-2022 走看看