2010-07-08 152 views
1

我有一個WCF服務,它接受一個對象作爲具有URI和方法名稱的參數。 我想要做的是有一個方法,它將查找@ URI,如果它包含單詞「localhost」它將使用反射並調用一個方法,作爲參數傳入的名稱,在同一個類,返回一個值並繼續。試圖在同一類中使用反射來調用方法

public class Test 
{ 
    public GetStatResponse GetStat(GetStatRequest request) 
    { 

     GetStatResponse returnValue = new GetStatResponse(); 

     if(Helpers.Contains(request.ServiceURI,"localhost", StringComparison.OrdinalIgnoreCase)) 
     { 
      MethodInfo mi = this.GetType().GetMethod(request.ServiceMethod /*, BindingFlags.Public | BindingFlags.IgnoreCase*/); 
      returnValue = (GetStatResponse)mi.Invoke(this,null); 
     } 

以上是有關這個問題的代碼段。我拉MethodInfo沒有問題,但我遇到了mi.Invoke的問題。我收到的異常是「異常已被調用的目標引發」。帶有內部異常「對象引用未設置爲對象的實例」。我試圖將代碼更改爲(GetStatResponse)mi.Invoke(new Test(),null),但沒有運氣。考試是課堂。

對於如何解決這個問題,我接受其他建議,我只是認爲反射可能是最簡單的。

,我與我的測試調用該方法被定義爲

public GetStatResponse TestMethod() 
{ 
     GetStatResponse returnValue = new GetStatResponse(); 
     Stat stat = new Stat(); 
     Stat.Label = "This is my label"; 
     Stat.ToolTip = "This is my tooltip"; 
     Stat.Value = "this is my value"; 

     returnValue.Stat = stat; 
     return returnValue; 
} 
+0

目標程序的方法不需要任何參數之前? – 2010-07-08 04:34:26

+0

目標方法沒有參數 – 2010-07-08 04:43:51

回答

0

喊你可能希望確保方法,你是通過反射拉動MethodInfo不爲空之前:

MethodInfo mi = this.GetType().GetMethod(
    request.ServiceMethod, 
    BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase 
); 

// Make sure that the method exists before trying to call it 
if (mi != null) 
{ 
    returnValue = (GetStatResponse)mi.Invoke(this, null); 
} 

更新後,似乎在您要調用的方法內引發異常:

GetStatResponse returnValue = new GetStatResponse(); 
// Don't forget to initialize returnValue.Stat before using it: 
returnValue.Stat = new WhateverTheTypeIs(); 
returnValue.Stat.Label = "This is my label"; 
+0

謝謝,好的提示。在我的測試中,我指定了方法,並且正在正確檢索MethodInfo。 – 2010-07-08 04:43:27

+0

找到拋出此異常的確切行。它可以在方法本身內嗎? – 2010-07-08 04:49:07

+0

引發異常的確切行是returnValue =(GetStatResponse)mi.Invoke(this,null)我調用的方法現在在我的原始文章中定義。 – 2010-07-08 04:53:07

0

因爲您沒有在GetMethod()調用中指定BindingFlags,所以只會返回匹配包含request.ServiceMethod且名稱爲PUBLIC的名稱的方法。

檢查您嘗試調用的方法是否爲public,否則MethodInfo將返回null。

如果它不是公開的,請將該方法設爲public或包含BindingFlags.NonPublic標誌。

此外,你應該始終確保英里!= NULL調用mi.Invoke

+0

我打電話的方法是公開的。我在那裏有BindingFlags,我只是將它們評論出來。取消註釋他們仍然會得到相同的結果。 – 2010-07-08 04:48:08