programing

'System.Int32'형식의 식은 'System.Object'반환 형식에 사용할 수 없습니다.

nasanasas 2021. 1. 7. 08:03
반응형

'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; }
        }
    }
}

참조 URL : https://stackoverflow.com/questions/2200209/expression-of-type-system-int32-cannot-be-used-for-return-type-system-object

반응형