Вызов универсального метода с переменной типа
У меня есть общий метод
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);