2023年8月

  public static object GetPropertyValue<TObject>(this PropertyInfo propertyInfo, TObject obj) where TObject : class
    {
        if (propertyInfo == null)
        {
            LoggerHandler.OnLogError("GetPropertyValue", new ArgumentNullException("propertyInfo null"));
            throw new ArgumentNullException("propertyInfo");
        }

        ParameterExpression parameterExpression = Expression.Parameter(typeof(TObject));
        return Expression.Lambda<Func<TObject, object>>(Expression.Convert(Expression.Property(Expression.Convert(parameterExpression, obj.GetType()), propertyInfo), typeof(object)), new ParameterExpression[1] { parameterExpression }).Compile()(obj);
    }
 public static void SetPropertyValue<TObject, TValue>(this PropertyInfo propertyInfo, TObject obj, TValue value)
    {
        if (propertyInfo == null)
        {
            LoggerHandler.OnLogError("SetPropertyValue", new ArgumentNullException("Property null"));
            throw new ArgumentNullException("propertyInfo");
        }

        if (propertyInfo.GetSetMethod() == null)
        {
            LoggerHandler.OnLogError("SetPropertyValue", new InvalidOperationException("Property does not have a setter"));
            throw new InvalidOperationException("Property does not have a setter");
        }

        ParameterExpression parameterExpression = Expression.Parameter(typeof(TObject));
        MemberExpression left = Expression.Property(Expression.Convert(parameterExpression, obj.GetType()), propertyInfo);
        ParameterExpression parameterExpression2 = Expression.Parameter(typeof(TValue));
        UnaryExpression right = Expression.Convert(parameterExpression2, propertyInfo.PropertyType);
        Expression.Lambda<Action<TObject, TValue>>(Expression.Assign(left, right), new ParameterExpression[2] { parameterExpression, parameterExpression2 }).Compile()(obj, value);
    }