2013-03-22 4 views
1

EDIT: класс/метод, который я пытаюсь запустить эту внутреннюю статична, и поэтому я не в состоянии передать это в generic.Invokeпрохождения статической информации отражения статических универсальных методов

У меня есть статический Класс доступа к данным, который я использую для автоматического анализа данных из разных источников. Я начал перегруппировать его, когда у меня возникла проблема. Im Тринга передать тип в шаблонный метод с помощью отражения, (метод затем анализирует тип и возвращает тип со значением) моего код в настоящее время выглядит как

Type type1 = typeof(T); 
var item = (T)Activator.CreateInstance(typeof(T), new object[] { }); 

foreach (PropertyInfo info in type1.GetProperties()) 
{ 
    Type dataType = info.PropertyType; 
    Type dataType = info.PropertyType; 
    MethodInfo method = typeof(DataReader).GetMethod("Read"); 
    MethodInfo generic = method.MakeGenericMethod(dataType); 
    //The next line is causing and error as it expects a 'this' to be passed to it 
    //but i cannot as i'm inside a static class 
    generic.Invoke(this, info.Name, reader); 
    info.SetValue(item,DataReader.Read<dataType>(info.Name, reader) , null); 
} 
+0

возможно дубликат (http://stackoverflow.com/questions/232535/how-to -use-отражательный к вызову унифицированного-метод) –

ответ

2

Я думаю DataReader.Read это статический метод, не так ли?

Следовательно, измените строку ошибки, как показано ниже, поскольку вы вызываете статический метод. Там не возражает, так что вы просто передать null в Invoke метод: [? Как использовать отражение для вызова универсального метода]

var value = generic.Invoke(null, new object[] {info.Name, reader}); 
0

Параметр типа для общего метода не является экземпляром Type; вы не можете использовать свою переменную таким образом. Тем не менее, вы можете использовать отражение для создания закрытой унифицированной MethodInfo вам требуется (то есть, с параметром типа заданного), который будет выглядеть примерно так:

// this line may need adjusting depending on whether the method you're calling is static 
MethodInfo readMethod = typeof(DataReader).GetMethod("Read"); 

foreach (PropertyInfo info in type1.GetProperties()) 
{ 
    // get a "closed" instance of the generic method using the required type 
    MethodInfo genericReadMethod m.MakeGenericMethod(new Type[] { info.PropertyType }); 

    // invoke the generic method 
    object value = genericReadMethod.Invoke(info.Name, reader); 

    info.SetValue(item, value, null); 
} 
Смежные вопросы