Я пытаюсь создать простую систему сценариев, которая будет использоваться для печати этикеток. Я делал это в прошлом без проблем, но сейчас я пытаюсь сделать это с помощью лямбда-функций, чтобы я мог кэшировать функции для повторного использования.
Код, который у меня есть, выглядит следующим образом ...
public static string GetValue<T>(T source, string propertyPath) {
try {
Func<T, Object> func;
Type type = typeof(T);
ParameterExpression parameterExpression = Expression.Parameter(type, @"source");
Expression expression = parameterExpression;
foreach (string property in propertyPath.Split('.')) {
PropertyInfo propertyInfo = type.GetProperty(property);
expression = Expression.Property(expression, propertyInfo);
type = propertyInfo.PropertyType;
}
func = Expression.Lambda<Func<T, Object>>(expression, parameterExpression).Compile();
object value = func.Invoke(source);
if (value == null)
return string.Empty;
return value.ToString();
}
catch {
return propertyPath;
}
}
В некоторых случаях это работает, но в других это не помогает. Кажется, проблема в том, что я пытаюсь вернуть значения в виде объектов - независимо от фактических типов данных. Я пытаюсь сделать это, потому что я не знаю во время компиляции, каким будет тип данных, но в долгосрочной перспективе мне нужна только строка.
Я получаю исключение, показанное в заголовке этого сообщения, всякий раз, когда пытаюсь получить доступ к свойству типа Int32, но я также получаю его для типов Nullable и других.
Исключение выдается, когда я пытаюсь скомпилировать выражение в функцию.
Кто-нибудь может подсказать, как мне поступить иначе, сохранив функциональность Lambda, чтобы я мог кэшировать методы доступа?