2016-04-28 4 views
0

у меня есть этот код:Использование TypeOf для моего родового параметра типа

foreach (var item in allClassesINeedList) 
{ 
    var genericMethod = temp.GetType().GetMethod("GenerateDocument").MakeGenericMethod(typeof(item)); 
    genericMethod.Invoke(temp, new object[] { item }); 
} 

Это выдает ошибку:

"The type or namespace name 'item' could not be found (are you missing a using directive or an assembly reference?)"

Моя цель выполнить для каждого объекта в allClassesINeedList (его List<object>) мой общий метод GenerateSingleDocument с каждым объектом в этом списке.

Что я сделал не так?

ответ

3

Вы можете заменить typeof(item) с item.GetType()

+0

Расширение - 'typeof' работает только с типом, известным компилятору во время компиляции, например. 'TypeOf (IDisposable)'. Чтобы найти тип объекта, используйте 'GetType()'. – yaakov

1

вам нужно использовать рефлексию ли? Если у вас есть контроль над классами, которые вы повторяете, было бы лучше создать интерфейс. Отражение происходит медленно и его следует избегать, когда это возможно.

public interface IDocumentCreator 
{ 
    void GenerateDocument(); 
} 

Добавьте этот интерфейс к классам:

public class YourClass : IDocumentCreator 
{ 
    // ... 

    public void GenerateDocument() 
    { 
     // ... 
    } 
} 

А потом сделать List<IDocumentCreator> вместо List<object>. Вы можете вызвать метод обычным способом:

List<IDocumentCreator> allClassesINeedList = ... 
foreach(IDocumentCreator item in allClassesINeedList) 
{ 
    item.GenerateDocument(); 
} 
+0

Мне нравится ваш подход, но в моем случае я должен использовать relfection, но thxs :) – kkkk00999

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