簡體   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