2015-05-14 3 views
0

У меня есть следующая структура, и мне нужно создать экземпляр из него через System.Reflection. Большая проблема заключается в том, что у меня есть общий и не общий параметр. Я должен использовать System.Reflection, потому что он будет вызываться в цикле, где T может меняться. Я посмотрел на this, но мне не удалось заставить его работать со вторым параметром (int tag). Мне жаль, что я должен задать этот основной вопрос.Построить общий экземпляр с общим параметром и нормальным параметром

struct pair<T> 
{ 
    public pair(T value,int tag) 
    {...} 
} 

так что мне нужно было бы волшебство в этом:

object createPair(object o,int tag) 
{ 
    return *somemagic* 
} 

EDIT: раствор делает структуры населения в сочетании с первым ответом. Если struct вложен в общую структуру, оба ответа вызывают исключение ArgumentException, независимо от ввода. Мне жаль, что я не знаю этого влияния на гнездование.

+2

Это пахнет [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Возможно, попробуйте объяснить, что вы пытаетесь сделать, а не то, что вы хотите сделать. –

+0

Думал, что это будет слишком долго и нехорошо объяснить. Я хочу создать нечто вроде словаря с несколькими ключами и возможность добавлять объекты с одним и тем же ключом. Он должен возвращать массив объектов, соответствующих указанным клавишам. Количество ключей должно быть переменным. Мне не разрешено ничего менять в структуре пары из-за ограничений проекта. – leAthlon

+0

Вы говорите об использовании _type_ каждого объекта в качестве ключа объекта или разрешении произвольного (но разрешенного столкновения) объекта Key? – David

ответ

3

Причина, по которой работает связанный ответ, заключается в том, что перегрузка Activator.CreateInstance вызывает бесполезные публичные конструкторы, также известные как конструктор по умолчанию.

Однако, этот же метод имеет overloads, которые включают signature, который принимает параметры.

public object CreatePair(object t, int tag) 
{ 
    var type = t.GetType(); 
    var targetType = typeof(Pair<>).MakeGenericType(type); 
    return Activator.CreateInstance(targetType, t, tag); 
} 
+0

'var targetType = typeof (Pair <>). MakeGenericType (type);' выдает исключение ArgumentException, потому что количество несоответствий аргументов – leAthlon

+0

Проблема все еще существует в той же позиции. – leAthlon

+0

в соответствии с https://dotnetfiddle.net/XulN1e этот код должен работать нормально. Если в вашем источнике есть что-то другое, обновите свой ответ. – David

2

сделать тип ввода общего с использованием метода MakeGenericType:

object createPair(object obj,int tag) { 
    Type type = typeof(Pair<>); 
    Type genericType = type.MakeGenericType(obj.GetType()); 
    return Activator.CreateInstance(genericType, obj, tag); 
} 

Но я хотел бы использовать дженерики вместо отражения, если это было возможно.

+0

не работает. ArgumentException в 'type.MakeGenericType (t)' – leAthlon

+0

@leAthlon, что вы отправляете в качестве аргумента? –

+0

обратите внимание, что поскольку эта подпись объявляет 'params object []', она думает, что вы ищете '.ctor (object [])', а не '.ctor (T)' - попробуйте удалить новый объект [] ' и передавая аргумент напрямую. Также обратите внимание, что .ctor имеет два аргумента: 'T' и' int', и вам также нужно передать int. – David

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