2010-10-18 3 views
26

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

Foo<T> 

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

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

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

Kindness,

Dan

+0

Можете ли вы показать код, где вы пытаетесь его использовать? Это определенно возможно, так что это, вероятно, синтаксическая ошибка. – RPM1984

ответ

34

Давайте предположим, что 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); 
+0

Спасибо любезно ... только то, что мне нужно! –

3

вы можете сделать этот тип,

typeof(Foo<>).MakeGenericType(bar); 
20

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

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() }); 

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

+0

+1 ... чуть позже принятого ответа, но чудесно положил! –

+3

@ 'Даниэль Эллиот' - Да, я знаю - через 41 секунду. Я надеялся, что мой чуть более подробный ответ будет преобладать, но, увы. ;-) – Enigmativity

+0

мой код получить работу, лучший ответ подробно .... Спасибо –

Смежные вопросы