У меня есть универсальный методВызова шаблонного метода с переменным типом
Foo<T>
У меня есть тип переменной bar
Можно ли добиться чего-то вроде Foo<bar>
Visual Studio ожидает типа или пространство имен на панели.
Kindness,
Dan
У меня есть универсальный методВызова шаблонного метода с переменным типом
Foo<T>
У меня есть тип переменной bar
Можно ли добиться чего-то вроде Foo<bar>
Visual Studio ожидает типа или пространство имен на панели.
Kindness,
Dan
Давайте предположим, что 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);
Спасибо любезно ... только то, что мне нужно! –
вы можете сделать этот тип,
typeof(Foo<>).MakeGenericType(bar);
Если я правильно понимаю ваш вопрос, вы, по существу, следующие типы определены:
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() });
Наслаждайтесь!
+1 ... чуть позже принятого ответа, но чудесно положил! –
@ 'Даниэль Эллиот' - Да, я знаю - через 41 секунду. Я надеялся, что мой чуть более подробный ответ будет преобладать, но, увы. ;-) – Enigmativity
мой код получить работу, лучший ответ подробно .... Спасибо –
Можете ли вы показать код, где вы пытаетесь его использовать? Это определенно возможно, так что это, вероятно, синтаксическая ошибка. – RPM1984