2014-09-05 2 views
4

Так нормальный Dictionary<string, Action> я использую так:Lambda Выражение в качестве ключа в словаре

validationsDictionary["ThisValidation"](); 

Однако строки могут быть пропущены набран. Поэтому я хотел бы использовать свойство модели как ключ:

validationsDictionary[x => x.ThisProperty](); 

Но, я не знаю точно, что тип будет, я попытался это:

Dictionary<Func<Model>, Action> 
Dictionary<Expressions<Model>, Action> 
Dictionary<Expression<Func<Model>>, Action> 

Я знаю, что некоторые люди не оценивают использование функций в качестве ключей. Так что я мог бы сделать что-то вроде этого:

void Validate(Expression<Func<Model>> key) 
{ 
    validationsDictionary[key.ToString()](); 
} 

Я не знаю, если key.ToString() является правильным свойство для использования, но вы получите суть.

EDIT

Итак, я использовал это:

Expression<Func<DisplayContentViewModel, object>> predicate 

И это работает, как лечить, давая мне возможность делать: x => x.SomeProperty

Я полагал, что я могу использовать predicate.Name для представления строкового представления имени. Итак, теперь мне нужно выяснить, как заполнить словарь!

+0

Вы можете использовать 'Словарь ' – Zer0

+0

Что такое' x'? не можете ли вы просто использовать 'x.ThisProperty'? (no lambda) – Sayse

+2

Eeh, если вы просто не хотите ошибаться в строках, почему бы не использовать 'enum's? –

ответ

1

Таким образом, после глядя на @SriramSakthivel комментарий о том, как получить имя свойства от лямбда, и я объединил его с моим кодом до сих пор я получил это в качестве рабочего раствора:

private void Validate(Expression<Func<DisplayContentViewModel, object>> propertyLambda) 
{ 
    var key = this.GetValidationKey(propertyLambda); 

    this.validationsDictionary[key](); 
} 

private void CreateValidationRule(
    Expression<Func<DisplayContentViewModel, object>> propertyLambda, 
    Action validationAction) 
{ 
    if (this.validationsDictionary == null) 
    { 
     this.validationsDictionary = new Dictionary<string, Action>(); 
    } 

    var key = this.GetValidationKey(propertyLambda); 

    if (this.validationsDictionary.ContainsKey(key)) 
    { 
     return; 
    } 

    this.validationsDictionary.Add(key, validationAction); 
} 

private string GetValidationKey(Expression<Func<DisplayContentViewModel, object>> propertyLambda) 
{ 
    var member = propertyLambda.Body as UnaryExpression; 

    if (member == null) 
    { 
     throw new ArgumentException(
      string.Format("Expression '{0}' can't be cast to a UnaryExpression.", propertyLambda)); 
    } 

    var operand = member.Operand as MemberExpression; 

    if (operand == null) 
    { 
     throw new ArgumentException(
      string.Format("Expression '{0}' can't be cast to an Operand.", propertyLambda)); 
    } 

    return operand.Member.Name; 
}