使用Convert. changetype在字符串和enum之间进行转换

本文关键字:之间 转换 enum Convert changetype 字符串 使用 | 更新日期: 2023-09-27 18:12:16

我有一个类,它表示一个通用的过滤器表达式

public class SimpleFilter : BaseRuleExpression
{
    public string field { get; set; }
    public string op { get; set; }
    public string data { get; set; }
}

当我需要在IQueryable上应用过滤器时,我只需将此过滤器转换为LambdaExpression对象并将此过滤器应用于DbSet实例,如以下示例所示

var filter = new SimpleFilter() {
    field = "CustomerID",
    op = "eq",
    value = "1"
};
ParameterExpression pe = Expression.Parameter( typeof( Customer ), "x" );
IQueryable<Customer> query = _ctx.Customers.AsQueryable<Customer>();
Expression<Func<Customer, bool>> lambda = (Expression<Func<Customer, bool>>)filter.ToExpression( query, pe );
var cList = _ctx.Customers.AsQueryable<Customer>().Where( lambda )

ToExpression方法如下:

MemberExpression memberAccess = GetMemberExpression( field, pe );
ConstantExpression filter = Expression.Constant( Convert.ChangeType( data, memberAccess.Type ) );
Operator condition = (Operator)StringEnum.Parse( typeof( Operator ), op );
LambdaExpression lambda = BuildLambdaExpression( memberAccess, filter, pe, condition, data );

问题发生在下一行,因为Convert.ChangeType法没有在stringenum之间直接转换。

ConstantExpression filter = Expression.Constant( Convert.ChangeType( data, memberAccess.Type ) );

我该如何解决这个问题?我可以在目标中检查类型enum并最终首先转换int中的string吗?

使用Convert. changetype在字符串和enum之间进行转换

我发现从TypeDescriptor获得转换器是在各种类型之间转换的更可靠的方法。这是ASP等技术使用的策略。. NET MVC模型绑定。

void Main()
{
    var converter = TypeDescriptor.GetConverter(typeof(Foo));
    Foo f = (Foo)converter.ConvertFromString("A");
    Console.WriteLine(f); // A
}
// Define other methods and classes here
public enum Foo {A, B, C}