2014-09-05 69 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()是使用正確的屬性,但你得到的要點。

編輯

所以,我用這個:

Expression<Func<DisplayContentViewModel, object>> predicate 

而且它就像一個治療給我做的能力:x => x.SomeProperty

我想我可以使用predicate.Name給出名稱的字符串表示。所以現在我必須弄清楚的是,如何填充字典!

+0

你可以使用'詞典<對象,Action>' – Zer0 2014-09-05 07:46:49

+0

'x'應該是什麼?你不能只使用'x.ThisProperty'? (沒有lambda) – Sayse 2014-09-05 07:46:52

+2

呃,如果你根本不想錯誤輸入字符串,爲什麼不使用'enum's? – 2014-09-05 07:47:35

回答

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; 
}