如何调用不带参数的方法?

Sar*_*edi 6 c# asp.net

我有一个类没有输入参数的公共方法.

 public partial class MyClass: System.Web.UI.MasterPage
   {

      public void HelloWorld() { 
       Console.WriteLine("Hello World "); 
      } 
    }
Run Code Online (Sandbox Code Playgroud)

我想调用HelloWorld() 方法到我的另一个类

public partial class ProductType_Showpt : System.Web.UI.Page
{
     protected void ChkChanged_Click(object sender, EventArgs e)
    {
          MyClass master =(MyClass) this.Master;   
          master.GetType().GetMethod("HelloWorld").Invoke(null, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

但它抛出了这个例外

Object reference not set to an instance of an object.
Run Code Online (Sandbox Code Playgroud)

Son*_*nül 7

我相信你的Invoke方法不应该把null参数作为第一个.

MyClass yourclass = new MyClass();    
MyClass.GetType().GetMethod("HelloWorld").Invoke(yourclass , null);
Run Code Online (Sandbox Code Playgroud)

对于第一个参数来自 MethodBase.Invoke

要调用方法或构造函数的对象.如果方法是静态的,则忽略此参数.如果构造函数是静态的,则此参数必须为null或定义构造函数的类的实例.


Sar*_*avu 5

在这里,您没有将类用作Invokeie 中的第一个参数,您必须应用如下代码。

MyClass master= new MyClass();  
master.GetType().GetMethod("HelloWorld").Invoke(objMyClass, null);
Run Code Online (Sandbox Code Playgroud)

现在,如果您有另一种带有某些参数的方法(重载方法),则可能存在另一种抛出错误的可能性。在这种情况下,您必须编写代码指定您需要调用没有参数的方法。

MyClass master= new MyClass();  
MethodInfo mInfo = master.GetType().GetMethods().FirstOrDefault
                (method => method.Name == "HelloWorld"
                && method.GetParameters().Count() == 0);
mInfo.Invoke(objMyClass, null);
Run Code Online (Sandbox Code Playgroud)

现在,如果您事先不知道您的类实例,您可以使用以下代码。在内部使用完全限定名称Type.GetType

Type type = Type.GetType("YourNamespace.MyClass");
object objMyClass = Activator.CreateInstance(type);
MethodInfo mInfo = objMyClass.GetType().GetMethods().FirstOrDefault
                   (method => method.Name == "HelloWorld"
                    && method.GetParameters().Count() == 0);
mInfo.Invoke(objMyClass, null);
Run Code Online (Sandbox Code Playgroud)

如果您的类实例事先未知,并且在另一个程序集中,则Type.GetType可能返回 null。在这种情况下,对于上面的代码,而不是Type.GetType调用下面的方法

public Type GetTheType(string strFullyQualifiedName)
{
    Type type = Type.GetType(strFullyQualifiedName);
    if (type != null)
        return type;
    foreach (var asm in AppDomain.CurrentDomain.GetAssemblies())
    {
        type = asm.GetType(strFullyQualifiedName);
        if (type != null)
           return type;
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

并像这样打电话

Type type = GetTheType("YourNamespace.MyClass");
Run Code Online (Sandbox Code Playgroud)


Adi*_*dil 2

您尝试在 null 而不是对象实例上调用方法,您可以在类实例而不是 null 上调用实例方法。在方法的第一个参数中传递类的实例HelloWorld

MyClass myClassObject = new MyClass();    
MyClass.GetType().GetMethod("HelloWorld").Invoke(myClassObject, null);
Run Code Online (Sandbox Code Playgroud)