как я был вводя этот вопрос, ответы 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);
Это кажется мне немного очевидным. Строка, разделенная запятыми, будет содержать строки. Вы имеете в виду, что хотите преобразовать их после факта? – StingyJack
Приведенный выше код преобразует «1,2,3» в новый список {1, 2, 3}, где T может быть списком , но также может быть просто int или DateTime или любым другим типом. Он также будет содержать списки любого произвольного типа, где строка с разделителями-запятыми может содержать элементы любого типа. –
Как бы вы гарантировали, что строка представляет любой произвольный тип, кроме указанных типов значений? Для сложных типов, что бы 'val' представлять: имя типа, значение поля? Не вникая в реальные приложения и использование, то, что вы пытаетесь сделать, не представляется возможным. – rae1