繁体   English   中英

如何使用 long 或 int64 的表达式常量?

[英]How to use expression constant with long or int64?

我有一个扩展方法

public static Expression<Func<T, bool>> ToExpression<T>(string operator, string name, object value)
{
    var parameter = Expression.Parameter(typeof(T));
    var memberExpression = Expression.Property(parameter, name);
    var constantExpression = Expression.Constant(value, typeof(memberExpression.Type));

    ....
    ..
    .
}

所以 Expression.Constant 会为这样的数据抛出异常:

我正在使用它,例如 class:

public class Person{
    public    long Number{get;set;}
}

var person1 = new Person{ Number=123}
var person2 = new Person{ Number=9876543210}

person1 有效,但 person2 抛出异常“ Argument types does not match ”。

我怎么解决这个问题?

您必须在创建常量表达式之前转换值。

public static bool IsNullable(Type type)
{
    return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>);
}

public static Type ToUnderlying(Type type)
{
    if (type == null) throw new ArgumentNullException(nameof(type));

    if (IsNullable(type)) type = type.GetGenericArguments()[0];
    if (type.IsEnum      ) type = Enum.GetUnderlyingType(type);

    return type;
}

public static bool SafeConvert(object value, Type type, out object newValue)
{
    newValue = value;
    if (value == null)
    {
        if (!IsNullable(type))
            return false;
        return true;
    }

    var fromType = value.GetType();

    if (fromType == type)
        return true;

    if (IsNullable(type))
    {
        type = ToUnderlying(type);
    }

    newValue = Convert.ChangeType(value, type);
    return true;
}

public static Expression<Func<T, bool>> ToFilterExpression<T>(string operatorStr, string name, object value)
{
    var parameter = Expression.Parameter(typeof(T));
    var memberExpression = Expression.Property(parameter, name);

    if (!SafeConvert(value, memberExpression.Type, out var convertedValue))
        throw new Exception($"Cannot convert '{value}' to type '{memberExpression.Type.Name}'.");

    var constantExpression = Expression.Constant(convertedValue, memberExpression.Type);

    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM