2011-12-02 2 views
1

일부 리플렉션 코드에서 제대로 작동하지 않는 분해 된 코드 조각이 있습니다. 나는 MethodHandles 등으로 작업하는 법을 알지 못하기 때문에 그것을 어떻게 유효하게 할 수 있는지에 대해 모른다. (나는 가능한 한 공제 할 수 있기 때문에) 반사 전문가를위한 매우 간단한 작업이어야한다고 생각한다. 인터페이스에서 메소드 핸들을 얻는 것이 필요합니다. 나 맞아?인터페이스에서 RuntimeMethodHandle을 얻으시겠습니까?

다음 매개 변수가 잘못되었습니다 .. IProductRepositoryItem.Code가 RuntimeMethodHandle

(MethodInfo) MethodBase.GetMethodFromHandle(IProductRepositoryItem.Code)); 

전체 코드이어야합니다 당신에게 전체를 일으키는 라인을 변경해야합니다 함수는 매개 변수가없는 가정

ParameterExpression parameterExpression = Expression.Parameter(typeof (T), "i"); 
// ISSUE: method reference 

Expression<Func<T, object>> property = 
    Expression.Lambda<Func<T, object>>(
     (Expression) Expression.Property(
      (Expression) Expression.Convert((Expression) parameterExpression, typeof (IProductRepositoryItem)), 
      (MethodInfo) MethodBase.GetMethodFromHandle(IProductRepositoryItem.Code)), 
       new ParameterExpression[1] { 
        parameterExpression 
       }); 
string key = entityHelper.GetField<T>(property); 
+0

저는 C#에서'RuntimeMethodHandle'을 사용한 적이 없습니다. 컴파일러를 작성하는 경우에는 매우 일반적입니다. – leppie

+0

다른 모든 질문에 [methodhandle]이 (가) Java 기능에 대한 것 같습니다. 이 질문에 더 적합한 C# 관련 태그가 있습니까? (나는 C#을 알지 못하기 때문에 그것을 바꿔 줄 사람은 누구나 가질 것입니다.) –

답변

2

이 :

typeof(IProductRepositoryItem).GetMethod("Code"); 

매개 변수를 사용하는 경우 적합한 과부하는 GetMethod입니다.

편집 : 당신이 속성에 액세스하려는 경우, 당신은 MethodInfo보다는 PropertyInfo 소요 Expression.Property의 오버로드를 사용해야합니다.

typeof(IProductRepositoryItem).GetProperty("Code"); 
+0

'GetMethodFromHandle'은'RuntimeMethodHandle'만을 허용하는 반면'PropertyInfo'를 리턴합니다. EDIT : 정확한 지시 사항을 따르지 못했습니다. – Ropstah

+0

@Ropstah : 어떻게'GetMethod'가'PropertyInfo'를 반환 할 수 있습니까? 계산하지 않습니다. – leppie

+0

코드는 속성입니다. 질문에 변경 사항을 반영하지 않고 코드를 변경한다고 생각했습니다.;) – Ropstah