Func <>를 객체 type의 인수와 함께 호출

c# expression-trees func

문제

나는 (예를 들어)이 Func<int, int> 내가 매개 변수가 형의 것을 제외하고, 평소와 같이 호출 할 object 보다는 평가자 int . Func은 수식 트리를 사용하여 만들어졌고 이제는 dynamic 변수에서 액세스되기 때문에 런타임시 Func 및 인수의 정확한 형식 만 알 수 있습니다. (단순화 된) 코드 예제 :

using System.Linq.Expressions;

namespace FuncExample
{
    class Program
    {
        static void Main(string[] args)
        {
            object myFunc = CreateFunc(); // Could return something like
                                          // Func<int, int>, but may return a
                                          // completely different Func<> depending on
                                          // arguments etc.
            object result = getFromFunc(5, myFunc);
        }

        public static object CreateFunc()
        {
            LambdaExpression expr = Expression.Lambda(
                /*
                 * Create an expression
                 */
                );
            return expr.Compile();
        }

        public static object getFromFunc(object arg, object func)
        {
            dynamic dynFunc = func;
            return dynFunc(arg); // <------- Throws exception
        }
    }
}

arg 를 정수로 변환하는 코드를 만들려면 어떻게해야합니까? 개체를 특정 형식으로 변환 한 후 다음과 같이 리플렉션을 통해 호출하는 제네릭 메서드를 만들려고했습니다.

public static T asT<T>(object n)
{
    return (T)n;
}

getFromFunc :

MethodInfo con = typeof(Program).GetMethod("asT").MakeGenericMethod(func.GetType().GetGenericArguments()[0]);
return dfunc(con.Invoke(null, new[] { value }));

그러나 MethodInfo.Invoke 는 또한 object 를 반환 object . 인수가 올바른 유형인지 확인하는 방법에 대한 아이디어가 있습니까?

수락 된 답변

이미 dynamic 사용하고 있으므로 dynamic 사용하지 않는 이유는 무엇입니까?

return dynFunc((dynamic)arg);

이렇게하면 arg 의 런타임 유형이 적절한 인수인지 여부를 확인하는 데 사용됩니다.


인기 답변

모든 대리자는 System.Delegate에서 파생됩니다. System.Delegate.DynamicInvoke 메서드를 사용하면 MethodInfo.Invoke ()를 사용하여 메서드를 호출하는 것과 마찬가지로 컴파일 타임에 형식을 모르는 대리자를 호출 할 수 있습니다. 예 :

class Program
{
    public static Delegate CreateFunc()
    {
      return new Func<int, int>(x => x + 1);
    }

    public static void Main(string[] args)
    {
        var func = CreateFunc();
        object inArg = 42;
        object result = func.DynamicInvoke(inArg);
        Console.WriteLine(result);
    }
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow