2013-03-18 24 views
5

Ho una classe in cui il metodo pubblico senza parametro di input.Come richiamare senza metodo parametri?

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

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

voglio richiamare HelloWorld() metodo nella mia un'altra classe

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); 
    } 
} 

ma è lanciare questa eccezione

Object reference not set to an instance of an object. 
+0

possibile duplicare con http://stackoverflow.com/questions/569249/methodinfo- invoke-out-parameter – KF2

+0

c'è un motivo per usare il reflection per chiamare il metodo? – TalentTuner

+0

Provo a chiamare direttamente master.Helloworld() ma non è ricerca, quindi devo chiamare il metodo Invoke. –

risposta

0

Si sta tentando di richiamare il metodo su nulla, invece di istanza di oggetto, puoi invocare il metodo di istanza sull'istanza della classe non su null. passare l'istanza della classe nel primo parametro del metodo HelloWorld.

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

devi specificare un'istanza per eseguire il metodo su:

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

Invia ancora l'errore ... –

5

Credo che il vostro metodo di Invoke non dovrebbe prendere null parametro come prima.

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

Per primi parametri da MethodBase.Invoke

L'oggetto su cui richiamare il metodo o il costruttore. Se un metodo è statico, questo argomento viene ignorato. Se un costruttore è statico, questo argomento deve essere null o un'istanza della classe che definisce il costruttore .

+0

Hello Soner: aggiorno il codice con l'implementazione reale. Provo a chiamare il metodo master page con il master.Helloworld() ma non è call, quindi provo con il metodo invoke. Ma la tua logica genera anche lo stesso errore. –

1

Qui non si utilizza la classe come primo parametro in Invoke, ad esempio, è necessario applicare il codice come di seguito.

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

Ora ci può essere un'altra possibilità di errore di lancio se si dispone di un altro metodo con alcuni parametri (metodo di overload). In tal caso, è necessario scrivere il codice specificando che è necessario richiamare il metodo che non ha parametri.

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

Ora se l'istanza della classe non è nota in anticipo è possibile utilizzare il seguente codice. Utilizzare Fully Qualified Name all'interno 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); 

Se l'istanza di classe è sconosciuta in anticipo, ed è in un altro assembly, Type.GetType può restituire null. In tal caso, per il codice precedente, invece di Type.GetType, chiamare il seguente metodo

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; 
} 

E chiamare come

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