Насколько я знаю, ты не можешь этого сделать. Основные имена должны быть уникальными. Эта схема именования является внутренней по отношению к SolrCloud и используется для различения различных индексов («ядер») друг от друга (каждый из которых составляет часть общей коллекции).
См. хороший ответ для получения дополнительной информации
Я бы предложил вместо того, чтобы пытаться самостоятельно анализировать XML, вы пытаетесь создать классы, которые будут десериализовываться из XML в классы. Я бы настоятельно настоятельно рекомендовал бы следовать ответу Бендевея.
Но если вы не можете сделать это, есть надежда. Вы можете использовать Convert.ChangeType
.
public static T GetValue<T>(String value)
{
return (T)Convert.ChangeType(value, typeof(T));
}
и использовать так
GetValue<int>("12"); // = 12
GetValue<DateTime>("12/12/98");
Вы может начинаться с чего-то примерно такого:
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
if (converter != null)
{
return (T)converter.ConvertFrom(value);
}
Если вам нужно проанализировать атрибуты, которые являются особыми типами, например, цвета или строки культуры или еще много чего, вы, конечно, должны будете встроить специальные случаи в вышеприведенное. Но это подойдет большинству ваших примитивных типов.
Чтобы это работало правильно, ваш универсальный метод должен будет делегировать свою фактическую работу выделенному классу.
Что-то вроде
private Dictionary<System.Type, IDeserializer> _Deserializers;
public static T GetValue<T>(String value) where T:new()
{
return _Deserializers[typeof(T)].GetValue(value) as T;
}
, где _Deserializers - это своего рода словарь, в котором вы регистрируете свои классы. (очевидно, потребуется некоторая проверка, чтобы гарантировать, что десериализатор был зарегистрирован в словаре).
(В этом случае, где T: new () бесполезен, потому что вашему методу не нужно создавать какой-либо объект.
снова с предупреждением, что это, вероятно, плохая идея:
class Item
{
public string ItemType { get; set; }
public string Name { get; set; }
}
public static T GetValue<T>(string xml) where T : new()
{
var omgwtf = Activator.CreateInstance<T>();
var xmlElement = XElement.Parse(xml);
foreach (var child in xmlElement.Descendants())
{
var property = omgwtf.GetType().GetProperty(child.Name.LocalName);
if (property != null)
property.SetValue(omgwtf, child.Value, null);
}
return omgwtf;
}
test run :
static void Main(string[] args)
{
Item piano = GetValue<Item>(@"
<Item>
<ItemType />
<Name>A Yamaha Piano</Name>
<Moose>asdf</Moose>
</Item>");
}
Если вы решите пойти по пути сериализации в POCO (Обычный старый объект CLR), тогда есть несколько инструментов, которые могут помочь вам сгенерировать ваши объекты.