2012-05-23 2 views
1

Я пытаюсь вызвать общий метод и должен передавать его Тип динамически. Но получите ошибку компиляции: «CS0246: Тип или имя пространства имен« t »не удалось найти. Вам не хватает директивы использования или ссылки на сборку ». Пожалуйста, скажите мне, что я упускаю из виду, спасибо.Pass MakeGenericMethod a Dynamic Type

... в основном ...

Type t = DiscoverType(field); // returns Type given FieldInfo via Type.GetType(string) 

MethodInfo method = typeof(testClass).GetMethod("MyGenericMethod", BindingFlags.NonPublic | BindingFlags.Instance); 
MethodInfo generic = method.MakeGenericMethod(typeof(t)); 
object[] args = {field}; 
generic.Invoke(this, args); 

общий метод ...

private void MyGenericMethod<T>(FieldInfo field) 
{ 
    field.SetValue(obj, new List<T>(objList)); 
} 
+0

Возможный дубликат [Как использовать отражение для вызова общего метода?] (Http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) – usr

ответ

2

Трудно знать, что именно вы пытаетесь сделать, но вы можете исправить ваш компилятор ошибка как это:

MethodInfo generic = method.MakeGenericMethod(t); 

используется оператор typeof, чтобы перейти от имени-типа к System.Type экземпляру , В вашем случае у вас уже есть экземпляр System.Type, который вам нужен, поэтому typeof здесь не пригодится.

+0

Я попытался сбрасывать typeof, и я получаю ошибку времени выполнения «ArgumentNullException: Аргумент не может быть пустым» – user1229895

+1

Тогда, полагаю, ваш метод 'DiscoverType' возвращает нулевую ссылку? Трудно сказать, не глядя на след стека исключения. – Ani

+0

вы правы Я думаю, что это null, я пытаюсь получить Type by string ... должен ли Type.GetType (string) работать? – user1229895