如何获取可空枚举的 toString 方法以构建表达式调用

How to get toString method for the Nullable Enum for building an Expression Call

enum StrategyType
{
   Straddle,
   Butterfly
}

class Test
{
   public StrategyType strategy {get; set;}
}

bool IsNullableEnum(Type t)
{
  Type u = Nullable.GetUnderlyingType(t);
  return (u != null) && u.IsEnum;
}

var toStringMethod = typeof(Enum).GetMethod("ToString", new Type[] { });

var entity = new Test();
var entityParameter = Expression.Parameter(entity);
Expression memberProperty = Expression.Property(entityParameter, "strategy");

    memberProperty = Expression.Call(memberProperty, toStringMethod);

如果我将测试中的 StrategyType 枚举 class 更改为 Nullable,如下所示:

StrategyType? strategyType {get; set;}

然后,我找不到为 Nullable Enum 获取 toString 方法的方法,类似于我为简单 Enum StrategyType 所做的方法。

谁能帮忙。

Nullable<> 有点棘手。当您找到这样的 属性 时,您必须对照给定实体检查从 prop.GetValue(entity) 返回的内容。这是 null(并且尝试调用 ToString() 是不可能的)或者您返回值类型(但装箱为对象),但您可以调用 normalToString()方法。

if (IsNullableEnum(prop.PropertyType) && prop.GetValue(entity) != null)
    memberProperty = Expression.Call(memberProperty, toStringMethod);

一般来说,您应该发出对 actual 类型方法的调用,而不是 Enum。它适用于可空值类型和不可空值类型,包括 enums.

您可以在 GetMethod 调用中使用实际类型,或者(最好)使用 string methodName 重载 Expressing.Call,例如

// (Test e) =>
var entityParameter = Expression.Parameter(typeof(Test), "e");
// e.strategy
Expression source = Expression.Property(entityParameter, "strategy");
// e.strategy.ToString()
var toStringCall = Expression.Call(source, "ToString", Type.EmptyTypes);