2016-01-18 4 views
0

Я использую ParseLambda от System.Linq.DynamicExpression namespace. Более подробную информацию можно найти на сайте ScottGu's blog.Передача Enum в качестве параметра в DynamicExpression

Следующий код бросает исключение 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 будет распознан или как передать параметр enum в качестве параметра.

Дополнительные исключения:

Если я изменить 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 namespace

ответ

1

Попробуйте использовать полное пространство имен для TeamType. Поскольку вы используете его в строке, вам, возможно, просто нужно, чтобы вы были более конкретными.

UPDATE:

Я думаю this answer поможет. Вам нужно заранее настроить заранее определенные типы.

+0

Я попробовал, что в первом. Я обновлю свой вопрос –

+0

Ссылка в классе бессмысленна, потому что вы отправляете строку. Используйте полное пространство имен так, как будто не используются «используемые» операторы. –

+0

Обновлен мой вопрос. Я сделал это, но только написал 'BE' вместо' App.BE' –

0

Существует гораздо проще решение - использовать только текстовое представление значения перечисления, то это будет работать:

var condition = "CurrentUser.CurrentTeamType == \"Admin\""; 
Смежные вопросы