【问题标题】:Convert between string and enum using Convert.ChangeType使用 Convert.ChangeType 在字符串和枚举之间进行转换
【发布时间】:2015-09-11 22:33:43
【问题描述】:

我有一个代表通用过滤器表达式的类

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 ) );

我该如何解决这个问题?我可以检查目标中的枚举类型并最终将string 转换为int 吗?

【问题讨论】:

  • 您可以依靠 Enum.Parse 或 Enum.TryParse 将字符串转换为枚举,然后直接将该枚举转换(甚至只是强制转换)为整数。

标签: c# casting expression expression-trees


【解决方案1】:

我发现从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}

【讨论】:

  • +1。我刚刚回到我的一个代码,并用你的 sn-p 替换了对字符串转换的 Enums/DateTime/Guids 的特殊处理。猜猜看所有测试都通过了,除了一个。但是只用了 3 行就去掉了 20 行代码。
猜你喜欢
  • 2014-01-17
  • 2021-01-11
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 2013-04-20
  • 2011-08-25
  • 1970-01-01
相关资源
最近更新 更多