반응형
'System.Int32'형식의 식은 'System.Object'반환 형식에 사용할 수 없습니다.
라벨을 인쇄하는 데 사용할 간단한 스크립팅 시스템을 만들려고합니다. 과거에는 아무 문제없이이 작업을 수행했지만 이제는 재사용을 위해 함수를 캐시 할 수 있도록 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 기능을 유지하면서 어떻게 다르게 진행할 수 있는지 제안 할 수 있습니까?
Expression.Convert를 사용해 보셨습니까 ? 그것은 권투 / 리프팅 / 기타 변환을 추가 할 것입니다.
Expression conversion = Expression.Convert(expression, typeof(object));
func = Expression.Lambda<Func<T, Object>>(conversion, parameterExpression).Compile();
이 코드가 도움이되기를 바랍니다.
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace Student
{
class Program
{
static void Main(string[] args)
{
var a = new Student();
PrintProperty(a, "Name");
PrintProperty(a, "Age");
Console.ReadKey();
}
private static void PrintProperty<T>(T a, string propName)
{
PrintProperty<T, object>(a, propName);
}
private static void PrintProperty<T, TProperty>(T a, string propName)
{
ParameterExpression ep = Expression.Parameter(typeof(T), "x");
MemberExpression em = Expression.Property(ep, typeof(T).GetProperty(propName));
var el = Expression.Lambda<Func<T, TProperty>>(Expression.Convert(em, typeof(object)), ep);
Console.WriteLine(GetValue(a, el));
}
private static TPorperty GetValue<T, TPorperty>(T v, Expression<Func<T, TPorperty>> expression)
{
return expression.Compile().Invoke(v);
}
public class Student
{
public Student()
{
Name = "Albert Einstein";
Age = 15;
}
public string Name { get; set; }
public int Age { get; set; }
}
}
}
반응형
'programing' 카테고리의 다른 글
가동 중지 시간을 최소화하면서 Java 웹앱을 배포하는 모범 사례? (0) | 2021.01.07 |
---|---|
별도의 파일 / 스크립트를 쓰거나 스레딩하지 않고 하위 프로세스에서 함수를 실행할 수 있습니까? (0) | 2021.01.07 |
Tkinter의 위젯 그룹에 스크롤바 추가 (0) | 2021.01.07 |
Java 빌더 패턴에 해당하는 Scala는 무엇입니까? (0) | 2021.01.07 |
gdb에서 바이너리 모드로 인쇄하는 방법은 무엇입니까? (0) | 2021.01.07 |