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

时间:2013-03-18 07:45:14

标签: c# asp.net

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

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

      public void HelloWorld() { 
       Console.WriteLine("Hello World "); 
      } 
    }

我想将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);
    }
}

但它抛出了这个异常

Object reference not set to an instance of an object.

5 个答案:

答案 0 :(得分:6)

我认为您的Invoke方法不应将null参数作为第一个参数。

MyClass yourclass = new MyClass();    
MyClass.GetType().GetMethod("HelloWorld").Invoke(yourclass , null);

来自MethodBase.Invoke

的第一个参数
  

调用方法或构造函数的对象。如果一个方法   是静态的,这个参数被忽略了。如果构造函数是静态的,那么这个   参数必须是 null 或定义该类的类的实例   构造

答案 1 :(得分:2)

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

MyClass myClassObject = new MyClass();    
MyClass.GetType().GetMethod("HelloWorld").Invoke(myClassObject, null);

答案 2 :(得分:2)

您必须指定一个实例来执行该方法:

MyClass myClassInstance = new MyClass();
MyClass.GetType().GetMethod("HelloWorld").Invoke(myClassInstance, null);

答案 3 :(得分:2)

此处您尚未将该类用作Invoke中的第一个参数,即您必须按以下方式应用代码。

MyClass master= new MyClass();  
master.GetType().GetMethod("HelloWorld").Invoke(objMyClass, null);

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

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

现在,如果您事先不知道类实例,则可以使用以下代码。在Type.GetType

中使用Fully Qualified Name
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);

如果您的类实例事先未知,并且在另一个程序集中,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;
}

并打电话给

Type type = GetTheType("YourNamespace.MyClass");

答案 4 :(得分:0)

您需要将HelloWorld()方法设置为static,或者将MyClass实例作为第一个参数传递给Invoke方法(如先前的回答所述)。 / p>