Используйте DataBinder.Eval с индексатором, содержащим точку - PullRequest
3 голосов
/ 20 января 2009

Как мне избежать точки в индексаторе? Первый DataBinder.Eval работает как положено. Второй бросает исключение.

System.ArgumentException: DataBinding: 'dict["a' is not a valid indexed expression.


Dictionary<string, int> dict = new Dictionary<string, int>();
dict.Add("aaa", 111);
dict.Add("bbb", 222);
dict.Add("ccc", 333);
dict.Add("ddd", 444);
dict.Add("a.aa", 555);
var blah = new { dict = dict, date = DateTime.Now };

Console.WriteLine(DataBinder.Eval(blah, "dict[\"aaa\"]")); 
// 111

Console.WriteLine(DataBinder.Eval(blah, "dict[\"a.aa\"]")); 
// System.ArgumentException: DataBinding: 'dict["a' is not a valid indexed expression.

Ответы [ 2 ]

3 голосов
/ 20 января 2009

DataBinder.Eval сначала разбивает строку по частям выражения через набор массивов токенов (который он определяет в статическом конструкторе как):

expressionPartSeparator = new char[] { '.' };

Затем эти части передаются в закрытый метод Eval, который будет использовать DataBinder.GetPropertyValue или DataBinder.GetIndexedPropertyValue по мере необходимости для дальнейшего определения значения выражения.

Чтобы обойти это, просто используйте GetIndexedPropertyValue напрямую со своим строковым выражением, например:

Console.WriteLine(DataBinder.GetIndexedPropertyValue(blah, "dict[a.aa]" ));

Также обратите внимание, что вам не нужны дополнительные кавычки ... они излишни.

1 голос
/ 20 января 2009

Используйте этот метод вместо:

Console.WriteLine(DataBinder.GetIndexedPropertyValue(blah, "dict[\"a.aa\"]"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...