Saya memiliki beberapa kelas statis di namespace mySolution.Macros
seperti
static class Indent{
public static void Run(){
// implementation
}
// other helper methods
}
Jadi pertanyaan saya adalah bagaimana mungkin memanggil metode-metode itu dengan bantuan refleksi?
Jika metode di mana TIDAK menjadi statis maka saya dapat melakukan sesuatu seperti:
var macroClasses = Assembly.GetExecutingAssembly().GetTypes().Where( x => x.Namespace.ToUpper().Contains("MACRO") );
foreach (var tempClass in macroClasses)
{
var curInsance = Activator.CreateInstance(tempClass);
// I know have an instance of a macro and will be able to run it
// using reflection I will be able to run the method as:
curInsance.GetType().GetMethod("Run").Invoke(curInsance, null);
}
Saya ingin kelas saya tetap statis. Bagaimana saya dapat melakukan sesuatu yang serupa dengan metode statis?
Singkatnya saya ingin memanggil semua metode Run dari semua kelas statis yang ada di namespace mySolution.Macros.
c#
reflection
dynamic
Tono Nam
sumber
sumber
GetMethod
.BindingFlags.Static
Anda mungkin tidak berhasil mendapatkan metode di tempat pertama ...Anda dapat benar-benar, sangat, sangat mengoptimalkan kode Anda dengan membayar harga pembuatan delegasi hanya sekali (tidak perlu membuat instance kelas untuk memanggil metode statis). Saya telah melakukan sesuatu yang sangat mirip, dan saya hanya men-cache delegasi ke metode "Run" dengan bantuan kelas helper :-). Ini terlihat seperti ini:
Jauh lebih cepat dengan cara ini.
Jika tanda tangan metode Anda berbeda dari Action, Anda dapat mengganti type-cast dan typeof dari Action ke salah satu jenis generik Action dan Func yang diperlukan, atau mendeklarasikan Delegasi Anda dan menggunakannya. Implementasi saya sendiri menggunakan Func untuk mencetak objek dengan cantik:
sumber
Saya lebih suka kesederhanaan ...
Pemakaian...
Tetapi jika Anda mencari sesuatu yang sedikit lebih kuat, termasuk penanganan pengecualian ...
Penggunaannya hampir sama ...
sumber