Я пытаюсь создать простую систему сценариев, которая будет использоваться для печати меток. Я делал это в прошлом с отражением без проблем, но теперь я пытаюсь сделать это с помощью функций Lambda, чтобы я мог кэшировать функции для повторного использования.
Код, который у меня есть до сих пор, следующий:
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, чтобы я мог кэшировать аксессоры?