2013-03-18 156 views
5

我有一個類沒有輸入參數的公共方法。如何不帶參數調用方法?

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

可能複製與http://stackoverflow.com/questions/569249/methodinfo- invoke-out-parameter- – KF2 2013-03-18 07:47:56

+0

是否有使用反射來調用方法的原因? – TalentTuner 2013-03-18 07:48:26

+0

我嘗試直接調用master.Helloworld(),但它不是搜索,所以我需要調用Invoke方法。 – 2013-03-18 08:34:44

回答

0

您試圖調用方法對空,而不是對象的情況下,你可以在類的實例上調用實例方法而不是null。在第一個參數HelloWorld方法中傳遞你的類的實例。

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

您必須指定一個實例上執行方法:

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

仍拋出錯誤... – 2013-03-18 07:56:35

5

我相信你Invoke方法不應該採取null參數作爲第一個。

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

對於第一參數從MethodBase.Invoke

在其上的對象調用的方法或構造。如果方法 是靜態的,則該參數將被忽略。如果構造函數是靜態的,則這個參數必須是null或定義構造函數的類的一個實例。

+0

Hello Soner:我用真正的實現更新代碼。我嘗試使用master.Helloworld()調用master頁面方法,但它不是調用,所以我嘗試使用invoke方法。但是你的邏輯也會拋出同樣的錯誤。 – 2013-03-18 08:45:53

1

在這裏你沒有使用這個類作爲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); 

現在,如果您的類實例未提前知道您可以使用下面的代碼。使用Fully Qualified NameType.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");