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);
    }
    }
  • 相关阅读:
    Flex 布局
    前端跨域之jsonp
    vs code 自定义代码片段
    vue中使用axios进行http通信
    Table边框合并
    getElementsBy 系列方法相比querySelector系列的区别
    vue中watch简单使用
    png图标任意赋色
    pc端与移动端适配解决方案之rem
    Express post请求无法解析参数的原因
  • 原文地址:https://www.cnblogs.com/Googler/p/2000145.html
Copyright © 2011-2022 走看看