Pertanyaan Saya ingin mendapatkan metode dengan refleksi


Saya ingin mendapatkan metode dengan refleksi, tetapi metode ini memiliki beberapa kelebihan ... dan parameter metode adalah tipe generik .. Bagaimana saya bisa melakukannya?

class Program
{
    static void Main(string[] args)
    {
        test obj = new test();
        Type[] types = { typeof(string) };
        var method = obj.GetType().GetMethod("Say", BindingFlags.Instance | BindingFlags.NonPublic, null, types, null);
        method.Invoke(obj, new object[] { "hello world" });
        Console.ReadKey();
    }
}

public class test
{
    private void Say(string value)
    {
        Console.WriteLine(value);
    }
    private void Say<T>(T t)
    {
        Console.WriteLine(t);
    }
}

saya bisa mendapatkan private void Say(string value)..tapi aku ingin mendapatkannya private void Say<T>(T t)..

Type[] types = { typeof(string) }; Berikut cara mengaturnya di sini?


4
2017-08-26 09:37


asal


Jawaban:


Berdasarkan komentar, saya lebih suka mencari solusi seperti:

public static MethodInfo GetGenericMethod(object obj, string methodName, Type genericParameter)
{
    var method = obj.GetType().GetMethods(BindingFlags.Instance | BindingFlags.NonPublic).FirstOrDefault(m => m.Name.Equals(methodName) && m.IsGenericMethod);
    return method.MakeGenericMethod(genericParameter);
}

Dan kemudian menyebutnya dengan sesuatu seperti:

GetGenericMethod(obj, "Say", typeof(string));

Anda kemudian akan dapat memohonnya seperti metode lain.


0
2017-08-26 10:09



Ada cara Anda.

Dapatkan semua metode dan temukan yang Anda cari

obj.GetType().GetMethods().Single(m=>m.GetParameters().Length = /* parameter count*/ && /* next condition */);

Gunakan pohon Ekspresi Menurut pendapat saya lebih baik dan kurang rentan kesalahan tetapi dapat digunakan hanya ketika Anda mengetahui metode mana yang Anda inginkan dalam waktu kompilasi.

Anda memerlukan beberapa metode pembantu yang mengekstrak Metode untuk pohon ekspresi.

public static MethodInfo Method(Expression<Action> methodAccess)
{
  return ((MethodCallExpression)methodAccess.Body).Method;
}

Maka Anda dapat menggunakannya seperti ini:

Get(()=>obj.Say<string>("My param")).GetGenericMethodDefinition();

Compiler akan mengurus pemilihan metode dan metode helper akan mengekstrak MethodInfo dari pohon ekspresi. GetGenericMethodDefinition () panggilan akan memberi Anda versi open-generic dari metode yang dipilih.


0
2017-08-26 09:46