Вызов универсального метода с переменной типа

У меня есть общий метод

Foo<T>

У меня есть переменная типа bar

Можно ли добиться чего-то вроде Foo<bar>

Visual studio ожидает тип или пространство имен в баре.

Kindness,

Дэн

2 ответа

Решение

Предположим, что Foo объявлен в классе Test, например:

public class Test
{
   public void Foo<T>() { ... }

}

Вы должны сначала создать экземпляр метода для типа bar используя MakeGenericMethod. И затем вызвать его, используя отражение.

var mi = typeof(Test).GetMethod("Foo");
var fooRef = mi.MakeGenericMethod(bar);
fooRef.Invoke(new Test(), null);

Если я правильно понимаю ваш вопрос, вы, по сути, определили следующие типы:

public class Qaz
{
    public void Foo<T>(T item)
    {
        Console.WriteLine(typeof(T).Name);
    }
}

public class Bar { }

Теперь, если у вас есть переменная bar определяется как таковой:

var bar = typeof(Bar);

Затем вы хотите иметь возможность позвонить Foo<T>, заменяя T с вашей переменной экземпляра bar,

Вот как:

// Get the generic method `Foo`
var fooMethod = typeof(Qaz).GetMethod("Foo");

// Make the non-generic method via the `MakeGenericMethod` reflection call.
// Yes - this is confusing Microsoft!!
var fooOfBarMethod = fooMethod.MakeGenericMethod(new[] { bar });

// Invoke the method just like a normal method.
fooOfBarMethod.Invoke(new Qaz(), new object[] { new Bar() });

Наслаждайтесь!

Вы можете сделать этот тип, выполнив следующее

typeof(Foo<>).MakeGenericType(bar);
Другие вопросы по тегам