【问题标题】:Pass an Enum as parameter in DynamicExpression在 DynamicExpression 中将枚举作为参数传递
【发布时间】:2016-01-18 17:11:21
【问题描述】:

我正在使用来自System.Linq.DynamicExpression 命名空间的ParseLambda。更多信息请访问ScottGu's blog

以下代码抛出Unknown identifier 'TeamType'异常

public bool CheckCondition()
{
    try
    {
        var condition = "CurrentUser.CurrentTeamType == TeamType.Admin";
        var currentUserParameter = Expression.Parameter(typeof(UserInfo), "CurrentUser");
        var dynamicExpression = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { currentUserParameter}, null, condition);
        var result = dynamicExpression.Compile().DynamicInvoke(CurrentUserInfo);
        return Convert.ToBoolean(result);
    }
    catch(Exception ex)
    {
      // do some stuff then throw it again
      throw ex;
    }
}

public enum TeamType
{
    Admin = 1,
    AnotherType = 2
}

public class UserInfo
{
    public short UserId { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public TeamType CurrentTeamType { get; set; }
}

CurrentUserInfo 只是UserInfo 的一个实例;

我的问题是我该怎么做才能识别TeamType,或者如何将枚举作为参数传递。

其他例外:

如果我将 condition 更改为 Convert.ToInt32(CurrentUser.CurrentTeamType) == 1,我会收到以下异常 Expression of type 'Namespace.TeamType' cannot be used for parameter of type 'System.Object' of method 'Int32 ToInt32(System.Object)'

如果我将condition 更改为(int)CurrentUser.CurrentTeamType == 1,我会收到以下异常Unknown identifier 'int'

如果我也像var condition = "CurrentUser.CurrentTeamType == App.BE.TeamType.Admin"; 这样添加命名空间,我会得到Unknown identifier 'App'。请注意,我引用了App.BE 命名空间

【问题讨论】:

    标签: c# dynamic expression


    【解决方案1】:

    尝试使用 TeamType 的完整命名空间。由于您在字符串中使用它,它可能只需要您更具体。

    更新:

    我认为this answer 会帮助你。您需要提前设置预定义类型。

    【讨论】:

    • 我第一次尝试过。我会更新我的问题
    • 类中的引用没有意义,因为您发送的是字符串。使用完整的命名空间,就像没有“使用”语句一样。
    • 更新了我的问题。我已经这样做了,但只发布了BE 而不是App.BE
    • 这里你需要超级清楚,因为我们看不到你所有的代码。所以如果你把App.BE放进去,错误仍然说BE是问题所在? App.BE 是否作为参考添加到您的项目中?如果您在上述方法中输入App.BE,是否可以解决?如果没有,则您缺少所需的项目参考。
    • 正如我在问题中所说的,参考是可以的。如果我输入 App.BE,我会看到它的 intelisense。
    【解决方案2】:

    有更简单的解决方案 - 只需使用枚举值的文本表示,即这将起作用:

    var condition = "CurrentUser.CurrentTeamType == \"Admin\"";
    

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多