作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个代表通用过滤器表达式的类
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 ) );
我该如何解决这个问题?我可以检查目标中的枚举类型并最终首先将 string
转换为 int
吗?
最佳答案
我发现从 TypeDescriptor
获取转换器是一种更可靠的在各种类型之间进行转换的方法。这是 ASP.NET MVC 模型绑定(bind)等技术使用的策略。
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}
关于c# - 使用 Convert.ChangeType 在字符串和枚举之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32525794/
我是一名优秀的程序员,十分优秀!