2015-08-11 1 views
1

Я пытаюсь получить фактический объект, содержащийся в списке, который сам содержится в задаче.Использовать отражение, чтобы получить реальную форму типа возврата Задача <Список <Словарь <строка, объект >>> вместо объекта

например. метод имеет следующую подпись, например.

public async Task<List<Dictionary<string,object>>> GetData() 

я в настоящее время использовать что-то вроде этого:

var member = type.GetMembers()[0]; 
var returntype = member.ReturnType.GetGenericArguments(); 
var temp = member.ReturnType.GetGenericArguments()[0]; 
if (temp.GetGenericArguments().Count() > 0) 
{ 
    temp.GetTypeInfo().GetGenericArguments(); 
    var innerttype = temp.GetGenericArguments()[0].FullName; 
} 

В настоящее время выше код (который не является полным, но только выписку из фактического кода) возвращение System.Object, как FULLNAME вместо словаря.

Любые предложения по его решению приветствуются.

+0

Я запустил ваш код и 'innerttype' печатает в' System.Collections.Generic.Dictionary'2 [[System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.Object , mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] '- именно то, что вы хотите. – Glorfindel

+2

Чтобы получить фактический тип значения объекта, хранящегося в словаре, вам нужно выполнить 'value.GetType()'. Насколько я вижу, вы используете рефлексию для перехода к типу возвращаемого метода «GetData», и в нем четко сказано, что словарь содержит значения типа «объект». Чтобы узнать фактический тип экземпляра каждого объекта, вам нужно их отдельно изучить. –

ответ

0

Если вы заявляете, что ваш словарь имеет тип <string, object> и и только когда-либо вставляете в него объекты, а не что-то выше на графике, вы всегда сможете получить только object.

Если вы храните всевозможные вещи там, и вам нужно получить их конкретный тип, чтобы вы могли взаимодействовать с ними, постарайтесь, чтобы все они соответствовали интерфейсу. Затем введите там тип интерфейса, заменив «объект». Если это не сработает, вы можете использовать дженерики. Тем не менее, вам все равно нужно знать тип раньше времени, чтобы иметь возможность взаимодействовать с ним.

Если вы действительно не представляете, что там есть и хотите динамически копаться в нем, это именно то, для чего был создан Reflection. Вы также можете посмотреть на dynamic type.

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

  • Нет связанных вопросов^_^