2009-09-13 13 views

risposta

32

Appena

Type.GetType(typeName).GetMethod(methodName).Invoke(null, arguments); 

dove typeName è il nome del tipo come una stringa, methodName è il nome del metodo come una stringa, e arguments è un array di oggetti che contengono gli argomenti per chiamare il metodo con .

+0

Wow, ok, sì, funziona - non conoscevo Type.GetType - assicurati solo che il nome della classe Static sia pienamente qualificato con lo spazio dei nomi –

+0

funziona per *** 'classe statica interna ***? ***? – Kiquenet

+0

@GeorgeMauer cosa succede se non c'è spazio dei nomi? – MonsterMMORPG

1

Ecco un profilo di base di quello che si potrebbe fare:

  1. scansione tutti gli oggetti del AppDomain corrente - trovare quello che corrisponde a ciò che si conosce il nome della classe per essere
  2. Prendi il metodo statico con il nome che conosci su quell'oggetto
  3. Richiamarlo dinamicamente.

Edit: Ciò funzionerà se non si conosce lo spazio dei nomi della classe statica. Altrimenti, la soluzione di Daniel Brückner è molto più semplice.

+0

penso ancora bisogno di eseguire la scansione del dominio di applicazione - Se si può solo creare un'istanza di una classe questo sarebbe dinamica lingua –

+1

Type.GetType? http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx – dtb

+2

Questa potrebbe essere una descrizione letterale di ciò che accade durante il processo di riflessione, tuttavia non penso che questa risposta sia utile per l'OP perché non dimostra praticamente o spiega come i passi che hai delineato possono essere presi usando il.net framework API – Crippledsmurf

1
System.Reflection.Assembly info = typeof(System.Environment).Assembly; 

Type t = info.GetType("System.Environment"); 
MethodInfo m = t.GetMethod("GetFolderPath"); 

object result = m.Invoke(null, arguments); 
3

In primo luogo è necessario per ottenere il tipo (mediante iterazione su l'assemblaggio utilizzando la riflessione)

Vedi questo link per ulteriori informazioni: http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx

o utilizzare

Assembly.GetType 

una volta che hai il tipo in mano è possibile iterare sui membri utilizzando la riflessione o

MethodInfo method = typeof(MyClass).GetMethod("MyMethod"); 

quindi è possibile utilizzare MethodInfo.Invoke e passare gli argomenti per invocare il metodo quando si desidera richiamarlo.

+0

** MyClass ** è pubblico, non è per *** 'class static interna *** ***? – Kiquenet

1

Quello che state facendo qui sta riflettendo sul tipo di nome Environment e utilizzando le GetPropery e GetGetMethod metodi per ottenere il metodo get della proprietà Environment.CurrentDirectory in questo modo;

var getMethod = typeof(Environment).GetProperty("CurentDirectory", BindingFlags.Public | BindingFlags.Static).GetGetMethod(); 
var currentDirectory = (string)getMethod.Invoke(null, null); 

Chiamare il metodo get di una proprietà restituisce il suo valore ed è equivoco a;

var value = Environment.CurrentDirectory; 
Problemi correlati