[英]Convert between string and enum using Convert.ChangeType
我有一个代表通用过滤表达式的类
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
方法在string
和enum
之间没有直接转换,因此问题发生在下一行。
ConstantExpression filter = Expression.Constant( Convert.ChangeType( data, memberAccess.Type ) );
我怎么解决这个问题? 我可以在target中检查类型enum并最终在int
首先转换string
吗?
我发现从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}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.