使用类的静态方法,当你只有类的类型的字符串作为一个字符串

问题描述:

我想知道是否有可能使用类方法时,你只知道它的字符串值的类名称。使用类的静态方法,当你只有类的类型的字符串作为一个字符串

比方说,我有一个类和类中我有一个像

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

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

使用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

你将不得不在整个过程中使用反射;例如:

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