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");
fonte
2015-02-19 14:59:01
possibile duplicare con http://stackoverflow.com/questions/569249/methodinfo- invoke-out-parameter – KF2
c'è un motivo per usare il reflection per chiamare il metodo? – TalentTuner
Provo a chiamare direttamente master.Helloworld() ma non è ricerca, quindi devo chiamare il metodo Invoke. –