2016-01-27 46 views
-3

我想調用類 「***」是對我的作品的解決方案,但我想要調用 這是給我的錯誤解決方案:調用在C#中的非靜態方法

Type t = Type.GetType(svClass); 
MethodInfo method = t.GetMethod("execute", BindingFlags.instance| BindingFlags.Public); 

Ret = (string)method.Invoke(null, new object[] { context.Request}); 
    public string execute(HttpRequest req) 

讓我試圖MethodInfo method = t.GetMethod("execute", BindingFlags.instance | BindingFlags.Public);

,但它給我的錯誤「非靜態方法需要一個目標」

***這是可行的解決方案用於靜態方法

Type t = Type.GetType(svClass); 
MethodInfo method = t.GetMethod("execute", BindingFlags.static| BindingFlags.Public); 

Ret = (string)method.Invoke(null, new object[] { context.Request}); 

調用

public class XXXXX 
    { 
     public static string execute(HttpRequest req){} 
    } 
+6

您需要在實例上調用非靜態方法。 –

+0

但他從我所看到的問題來看,問題是綁定標誌。 –

+0

是的,所以我嘗試公共字符串執行(HttpRequest req){} 和BindingFlags.instance – lol

回答

1

祕密就是改變你的綁定標誌以獲得您想要調用該方法的簽名匹配的MethodInfo。

如:

public static string execute(HttpRequest req){} 

將通過

MethodInfo method = t.GetMethod("execute", BindingFlags.static| BindingFlags.Public); 

不過來訪問,訪問

public string execute(HttpRequest req){} 

你需要做的

var classObj = new Class(); 
MethodInfo method = classObj.GetType().GetMethod("execute", BindingFlags.Instance| BindingFlags.Public); 

實例表示該方法是類對象的成員,而不是類類型的成員。 (實例VS靜態)

var parameterArray = new object[]{ YourHttpRequestHere}; 
var result = method.Invoke(classObj,parameterArray); 

所以記住,如果該方法屬於一個實例,那麼你需要抓住從該實例類型的方法,然後你需要用實例變量的引用來調用它(classObj)。

+0

謝謝,問題是類名是作爲輸入參數傳遞的,所以爲此我從字符串'xvClass'的輸入中讀取它,然後輸入 Type t = Type.GetType(svClass);和 - > MethodInfo method = t.GetMethod(「execute」,BindingFlags.static | BindingFlags.Public); 爲了讓我的課堂成爲一個對象,我不知道如何用字符串中的課程名稱做到這一點 – lol

+0

這個答案應該有100個upvotes – LastTribunal