PragmaGames
@PragmaGames
Увлекаюсь Unity.

Как с помощью рефлексии получить дженерик метод принимающий дженерик параметр?

Всем привет. Есть такой код

public T Replace<T> () where T : BaseScreen
{
     // TODO
}

public T Push<T>(T screen = null) where T : BaseScreen
{
    //TODO
}

public T Push<T>(string screenName) where T : BaseScreen
{
    //TODO
}


Я понимаю как получить метод Replace :
var method = typeof(Navigator).GetMethod(nameof(Replace), BindingFlags.Instance | BindingFlags.Public);
var genericMethod = method.MakeGenericMethod(typeScreen);


Метод Push получающий строку получить так же просто :
var method = typeof(Navigator).GetMethod(nameof(Push), BindingFlags.Instance | BindingFlags.Public, null, CallingConventions.Any,new Type[] {typeof(string)}, null);

var genericMethod = method.MakeGenericMethod(typeScreen);


Но как нам получить метод Push принимающий T ?
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
class Test
{
    public T X<T>(T x) => x;
    public T X<T>() => throw new InvalidOperationException();
}

typeof(Test)
.GetMethods() // Берём методы
.Where(x => x.Name == "X") // с именем "X"
.Where(x => x.IsGenericMethod) // обобщённые
.Where(x =>
{
    var parameters = x.GetParameters();
    var genericParameters = x.GetGenericArguments();
    // У которых только один generic-параметр и 1 аргумент, которые равны
    if (parameters.Length == 1 && genericParameters.Length == 1)
    {
        var t0 = parameters[0].ParameterType;
        var t1 = genericParameters[0];
        return t0 == t1;
    }
    else
    {
        return false;
    }
})
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы