2015-02-08 48 views
0

我想知道是否有可能使用類方法時,你只知道它的字符串值的類名稱。使用類的靜態方法,當你只有類的類型的字符串作爲一個字符串

比方說,我有一個類和類中我有一個像

public class SomeClass 
{ 
    public static string Do() 
    { 
     //Do stuff 
    } 
} 

靜態方法和使用類時,我想是這樣

string str = (GetType(SomeClass)).Do(); 

當使用我想給方法這個類的名字就像字符串一樣,我想把SomeClass作爲一個字符串。

+0

見['MethodInfo.Invoke'方法](https://msdn.microsoft.com/en-us/library/system.reflection.methodinfo.invoke(V = VS。 110)的.aspx)。 – 2015-02-08 18:20:04

+0

你已經用反射標記了這個問題,這就是你所追求的。 – 2015-02-08 18:20:15

回答

3
var t = Type.GetType("MyNamespace.SomeClass"); 
var m = t.GetMethod("Do"); 

m.Invoke(null, new object[] { /* Any arguments go here */ }); 
+0

當我嘗試這個,甚至鍵入t = Type ... GetMethod似乎沒有定義。 – 2015-02-08 18:43:50

1

使用Type.GetMethod獲取該方法的方法信息對象,然後調用MethodInfo.Invoke來執行它。對於靜態方法,傳遞null作爲第一個參數(對象值):

Type type = typeof(SomeClass); 
type.GetMethod("Do").Invoke(null, null); 

如果你不知道在編譯時的類名,你也可以使用object.GetTypeType.GetTypeAssembly.GetType要獲得類型的對象在運行時(取決於你有什麼信息)。然後,你可以以同樣的方式使用它:

Type type = someObject.GetType(); // or Type.GetType("SomeTypeName"); 
type.GetMethod("Do").Invoke(null, null); 

爲了安全起見,請務必檢查GetMethod是否實際返回的方法,讓你有一些確認該類型存在的方法即可。

+0

只在運行時才知道類名。 – 2015-02-08 18:20:59

+0

如果OP在編譯時足夠了解'typeof(SomeClass)',那麼他們可能只需編寫'SomeClass.Do()'。 – 2015-02-08 18:22:29

+0

@Asad我認爲捅錯了問題,就好像OP在編譯時知道該類,但不知道該方法。 – 2015-02-08 18:23:40

1

你將不得不在整個過程中使用反射;例如:

object result = Type.GetType(typeName).GetMethod(methodName).Invoke(null, args); 
相關問題