2013-10-02 1 views
-2

не задана функцияКак преобразовать запятую разделителей строки в список <T> где T неизвестно до выполнения

T Func<T>(string val) {} 

, где цель заключается в преобразовании Вэл Т, где Т может быть ИНТОМ, или может быть также список (в этом случае Допустимы запятыми список вещей, которые мы надеемся, могут быть преобразованы в Ts

игнорируя ИНТ версию, потому что это легко, как вы преобразовать строку в список

+0

Это кажется мне немного очевидным. Строка, разделенная запятыми, будет содержать строки. Вы имеете в виду, что хотите преобразовать их после факта? – StingyJack

+0

Приведенный выше код преобразует «1,2,3» в новый список {1, 2, 3}, где T может быть списком , но также может быть просто int или DateTime или любым другим типом. Он также будет содержать списки любого произвольного типа, где строка с разделителями-запятыми может содержать элементы любого типа. –

+0

Как бы вы гарантировали, что строка представляет любой произвольный тип, кроме указанных типов значений? Для сложных типов, что бы 'val' представлять: имя типа, значение поля? Не вникая в реальные приложения и использование, то, что вы пытаетесь сделать, не представляется возможным. – rae1

ответ

-2

как я был вводя этот вопрос, ответы cam e для меня, поэтому я оставляю этот вопрос ответом в качестве руководства для других.

У меня есть функция, такие как

T Func<T>(string val) {} 

Внутри этой функции я сделать различную обработку, один элемент, который состоит в преобразовании Val к T.

У меня есть другая функция, я использую для этой цели

T ChangeType<T>(this object value) 

Эта функция в основном оберткой Convert.ChangeType с некоторой дополнительной обработки, чтобы обращаться с вещами, которые Convert.ChangeT ype не может делать из коробки (украден из stackoverflow в другом месте)

Все работает отлично для большинства типов, но в некоторых случаях T представляет собой список, а val - это список значений, разделенных запятыми.

я могу правильно определить, если T является список с помощью

if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(List<>)) 

, а затем я могу создать экземпляр соответствующего типа возвращаемого списка следующим образом

T list = (T)Activator.CreateInstance(returnType); 

Теперь, мне нужно позвонить моему ChangeType на каждом разделите значение из строки и добавьте их в список.

var method = typeof (XmlUtil).GetMethod("ChangeType", new [] {typeof(object)}); 
var genericMethod = method.MakeGenericMethod(subType); 
var convertedItem = genericMethod.Invoke(null, new [] {item}); 
var subType = returnType.GetGenericArguments()[0]; 

Все до сих пор. Теперь у меня есть

dynamic list; //instantiated with a List<TT> 
var convertedItem; // which is typed as an object, instantiated with a type TT. 

Как позвонить

list.Add(convertedItem); 

динамический будет обрабатывать тот факт, что я не имею известный интерфейс для списка, но во время выполнения я получаю сообщение об ошибке, потому что я Я пытаюсь добавить объект в список, даже если объект действительно имеет тип T как экземпляр.

Конечным ответом является листинг списка как неосновного IList, где вы можете добавить объект.

System.Collections.IList list2; 
list2 = (System.Collections.IList) list; 
list2.Add(convertedItem); 
+4

Пожалуйста, отдельный ответ и вопрос –

+0

Я разделил их по запросу –

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