簡體   English   中英

使用Convert.ChangeType在字符串和枚舉之間轉換

[英]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方法在stringenum之間沒有直接轉換,因此問題發生在下一行。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM