Выражение типа 'System.Int32' не может использоваться для возвращаемого типа 'System.Объект'
Я пытаюсь создать простую систему сценариев, которая будет использоваться для печати этикеток. Я делал это в прошлом с отражением без проблем, но теперь я пытаюсь сделать это с помощью лямбда-функций, чтобы я мог кэшировать функции для повторного использования.
код, который у меня есть до сих пор, выглядит следующим образом...
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 типов и других. Исключение выдается, когда я пытаюсь скомпилировать выражение в функцию.
может кто-нибудь предложить, как я мог бы пойти об этом по-другому, пока поддержание функциональности лямбда, чтобы я мог кэшировать методы доступа?
1 ответ:
вы пробовали использовать выражение.Конвертировать? Это добавит преобразование бокса / подъема / etc.
Expression conversion = Expression.Convert(expression, typeof(object)); func = Expression.Lambda<Func<T, Object>>(conversion, parameterExpression).Compile();