2011-12-02 83 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

編輯:如果你想訪問的屬性,你應該使用的Expression.Property,需要一個PropertyInfo而非MethodInfo過載。

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

返回一個'PropertyInfo',而'GetMethodFromHandle'只接受'RuntimeMethodHandle'。 編輯:哎呀我沒有按照你的確切指示... – Ropstah

+0

@Ropstah:GetMethod如何返回PropertyInfo?不計算。 – leppie

+0

代碼是一個屬性,我想我只是改變它而沒有'反映'在這個問題上的變化......;) – Ropstah