2013-04-23 3 views
4

나는이 있고,"람다 선언 제공된 매개 변수의 잘못된 수는"

public static object Create() 
{ 
    return new object(); 
} 

이 작동 :

var m = typeof(Class).GetMethod("Create"); 
var e = Expression.Call(m, Expression.Parameter(typeof(Type))); 
var t = Expression.Parameter(typeof(Foo)); 
Func<object> f = Expression.Lambda<Func<object>>(e, t).Compile(); 

얻을 수 처리되지 않은 'System.ArgumentException'형식의 예외가 System.Core.dll에서 발생했습니다. 추가 정보 : 람다 선언에 제공된 매개 변수의 수가 올바르지 않습니다.. t 매개 변수는 더미 유형 Foo에 대한 표현식입니다. 나는 그것이 부적절하다고 생각한다. 내가 어디서 잘못 된거야?

+0

나는이 질문에 주어진 제목이 오해의 소지가 있다고 생각합니다. 누군가 그것을 고칠 수 있습니까? – nawfal

+0

@nawfal : 직접 할 수 있습니다. 질문을 편집하십시오. –

+0

@DanielHilgarth 물론 나는 내가 옳은 것을 확신 할 수 없다는 점을 제외하고는 특권을 가지고 있습니다. 더 많은 knowledgable 커뮤니티에 그렇게 할 것을 요청 했습니까? (잠재적 인 미래 방문자를 도울 수 있도록) – nawfal

답변

14

문제는 당신이 당신이 매개 변수를 사용하기를 원한다고 말한 것입니다. 그러나 당신은 실제로 그것을 지정하기 위해 어디에도 제공하지 않습니다. 서로 다른 유형의 두 개의 ParameterExpression을 만든 다음 결과를 Func<object>으로 변환하려고합니다. 매개 변수가 전혀 없습니다. 같은 ParameterExpressionExpression.Call 방법과 Expression.Lambda 방법 모두에 대한 인수 목록에서 사용되는

var m = typeof(Class).GetMethod("Create"); 
var p = Expression.Parameter(typeof(Type), "p"); 
var e = Expression.Call(m, p); 
Func<Type, object> f = Expression.Lambda<Func<Type, object>>(e, p).Compile(); 

참고 : 당신은 같은 것을 원한다.

+0

@ DanielHilgarth에게갔습니다. 감사합니다. –

+1

필자는 이것을 이해하지 못합니다 - "인스턴스 메소드 호출의 대상인 것처럼 p를 사용하지 않으려면 Expression.Call 인수에 대한 배열을 명시 적으로 만들었습니다." 그것은 배열 대신 단지 p로 잘 작동하는 것 같습니다 ... 조금 더 확장 할 수 있습니까? –

+1

또한 var e = Expression.Call (m, null, p)를 사용하면 "ArgumentNullException : 값을 null 일 수 없습니다. 매개 변수 이름 : arg0"이됩니다. –