c# - 使用 Convert.ChangeType 在字符串和枚举之间进行转换

标签 c# casting expression expression-trees

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

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

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

最佳答案

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

相关文章:

c# - WPF 中的类概念

entity-framework - 如何调用 lambda 表达式中的方法在 Entity Framework 中运行?

c# - 如何序列化接口(interface)类型成员

c# - 在 C# 中从外部应用程序获取 UI 文本

c# - 浅拷贝值类型数组的一段

c++ - 将 vector 值复制到 char*

java - SonarQube (SonarLint/Sonar-JAVA) 不应使用冗余强制转换

c++ - 通过转换为 Visual C++ 中的函数指针来执行 shellcode

c# - 从 3 个通用类型中推断出 2 个

c# - 通过表达式将方法作为参数传递