我有這堂課:
public class user
{
public string FirstName { get; set; }
public string LastName { get; set; }
public EyeColor EyeColor { get; set; }
}
public enum EyeColor
{
Brown,
Black
}
我可以user.GetType().GetProperties();
用來獲取屬性,然后獲取它們的值。
但是對于列舉不同,我要做的就是:獲取列舉索引,例如棕色是0
,黑色是1
用于列舉欄位的動態搜索。
但是我有一個獲取索引的通用方法,但我不能使用int enumIndex = (EyeColor)user.EyeColor;
,因為我不知道哪種列舉將傳遞給通用方法。
public static IQueryable<T> CreateEqualExpressions<T>(IQueryable<T> query, object model)
{
var result = query;
var propertiesToSearch = model.GetType().GetProperties()
.Where(x => Attribute.IsDefined(x, typeof(EqualSearchAttribute)))
.ToList();
if (propertiesToSearch.Count > 0)
{
foreach (var propertyInfo in propertiesToSearch)
{
var propertyValue = propertyInfo.GetValue(model);
if (!string.IsNullOrWhiteSpace(propertyValue?.ToString()))
{
var parameter = Expression.Parameter(typeof(T));
var property = Expression.Property(parameter, propertyInfo.Name);
if (propertyValue is string)
propertyValue = propertyValue.ToString()?.Trim();
var constantValue = Expression.Constant(propertyValue);
var equal = Expression.Equal(property, constantValue);
var exp = Expression.Lambda<Func<T, bool>>(equal, parameter);
result = result.Where(exp);
}
}
}
return result;
}
字串一切正常,但列舉不起作用,因為propertyValue
is: Brown
or Black
,但對于動態搜索,我需要像0
or一樣對它們進行索引1
。有什么建議嗎?
uj5u.com熱心網友回復:
如果我理解正確,您只需Convert.ToInt64
將列舉值轉換為 a long
,它適合每個列舉基礎型別。
var value = propertyInfo.GetValue(model);
if (propertyInfo.PropertyType.IsEnum) {
long underlyingEnumValue = Convert.ToInt64(value);
// construct your expression here...
}
請注意,如果您正在構建一個Expression.Equal
,其中一個運算元是EyeColor
屬性訪問,您也應該將其轉換為long
:
var equal = Expression.Equal(
Expression.Convert(property, typeof(long)),
Expression.Constant(underlyingEnumValue)
);
示例代碼:
var prop = typeof(User).GetProperty("EyeColor")!;
var value = prop.GetValue(new User() { EyeColor = EyeColor.Black });
var underlyingEnumValue = Convert.ToInt64(value);
var p = Expression.Parameter(typeof(User));
var lambda = Expression.Lambda(
Expression.Equal(
Expression.Convert(
Expression.Property(p, prop),
typeof(long)), Expression.Constant(underlyingEnumValue)
), p
);
var del = lambda.Compile();
var result1 = del.DynamicInvoke(new User() { EyeColor = EyeColor.Brown });
var result2 = del.DynamicInvoke(new User() { EyeColor = EyeColor.Black });
Console.WriteLine(result1); // False
Console.WriteLine(result2); // True
uj5u.com熱心網友回復:
這樣的事情呢?
var type = propertyInfo.PropertyType;
if (type.IsEnum)
{
var enumIndex = (int) propertyValue;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/528146.html