Преобразование от строки до <T>

Насколько я знаю, ты не можешь этого сделать. Основные имена должны быть уникальными. Эта схема именования является внутренней по отношению к SolrCloud и используется для различения различных индексов («ядер») друг от друга (каждый из которых составляет часть общей коллекции).

См. хороший ответ для получения дополнительной информации

58
задан Saint Domino 9 April 2009 в 03:54
поделиться

5 ответов

Я бы предложил вместо того, чтобы пытаться самостоятельно анализировать 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");
156
ответ дан yogi 24 November 2019 в 18:41
поделиться

Вы может начинаться с чего-то примерно такого:

TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
if (converter != null)
{
   return (T)converter.ConvertFrom(value);
}

Если вам нужно проанализировать атрибуты, которые являются особыми типами, например, цвета или строки культуры или еще много чего, вы, конечно, должны будете встроить специальные случаи в вышеприведенное. Но это подойдет большинству ваших примитивных типов.

6
ответ дан womp 24 November 2019 в 18:41
поделиться

Чтобы это работало правильно, ваш универсальный метод должен будет делегировать свою фактическую работу выделенному классу.

Что-то вроде

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 () бесполезен, потому что вашему методу не нужно создавать какой-либо объект.

0
ответ дан Denis Troller 24 November 2019 в 18:41
поделиться

снова с предупреждением, что это, вероятно, плохая идея:

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>");
}
0
ответ дан Jimmy 24 November 2019 в 18:41
поделиться

Если вы решите пойти по пути сериализации в POCO (Обычный старый объект CLR), тогда есть несколько инструментов, которые могут помочь вам сгенерировать ваши объекты.

  • Вы можете использовать xsd.exe для генерации файла .cs на основе вашего определения XML
  • В WCF REST Starter Kit Preview 2 есть новая функция, которая называется «Вставить как HTML». Эта функция действительно хороша и позволяет вам взять блок HTML, который находится в буфере обмена, а затем, когда вы вставляете его в файл cs, он автоматически преобразует XML в объект CLR для сериализации.
4
ответ дан 24 November 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: