我有一个类没有输入参数的公共方法。
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.
答案 0 :(得分:6)
我认为您的Invoke
方法不应将null
参数作为第一个参数。
MyClass yourclass = new MyClass();
MyClass.GetType().GetMethod("HelloWorld").Invoke(yourclass , null);
的第一个参数
调用方法或构造函数的对象。如果一个方法 是静态的,这个参数被忽略了。如果构造函数是静态的,那么这个 参数必须是 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
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>