Вызов универсальной функции с параметром типа, определенным во время выполнения - PullRequest
8 голосов
/ 21 сентября 2009

У меня есть вопрос, связанный с вызовом универсального метода класса с параметром типа, который известен во время выполнения.

В частности, код выглядит так:


FieldInfo[] dataFields = this.GetType().GetFields( BindingFlags.Public | BindingFlags.Instance );

// data is just a byte array used internally in DataStream
DataStream ds = new DataStream( data );

foreach ( FieldInfo field in dataFields )
{
    Type fieldType = field.FieldType;

    // I want to call this method and pass in the type parameter specified by the field's type
    object objData = ( object ) ds.Read<fieldType>();
}

Функция Read () выглядит так:


public T Read() where T : struct

Цель этой функции - вернуть данные, прочитанные из байтового массива.

Есть ли способ вызвать универсальный метод во время выполнения, как это?

Ответы [ 3 ]

12 голосов
/ 21 сентября 2009

Самый простой способ справиться с этим - сделать неуниверсальную перегрузку функции Read с одним параметром Type:

public object Read(Type t)

И затем пусть общая версия вызывает неуниверсальную версию:

public T Read<T>() where T : struct
{
    return (T)Read(typeof(T))
}
7 голосов
/ 21 сентября 2009

Вам нужно будет создать methodinfo и вызвать метод Read:

MethodInfo method = typeof(DataStream).GetMethod("Read");
MethodInfo generic = method.MakeGenericMethod(fieldType);
object objData = generic.Invoke(ds, null);
1 голос
/ 21 сентября 2009

Вероятно, было бы лучше пойти по пути Ли. Обобщения являются условным обозначением во время разработки, чтобы вам не приходилось писать общий код для многих типов классов. Во время компиляции каждый вызов универсального метода или класса генерируется в основном как отдельный класс.

Гораздо проще просто окунуть тип и использовать рефлексию, что в любом случае вам и придется делать.

...