Избегание бокса / распаковки при неизвестном вводе

Я создаю приложение, которое анализирует XML и извлекает некоторые данные. Каждый узел xml определяет данные (const), имя столбца набора записей для получения данных из (var), подмножество возможных значений данных в зависимости от некоторого условия (enum) и других. Он также может указывать, наряду с данными, формат, в котором данные должны быть показаны пользователю.

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

Итак, вопрос: как я могу сохранить возвращаемое значение во временной переменной, избегая упаковки / распаковки, когда тип неизвестен, и я не могу использовать дженерики?

P.S.: я разрабатываю синтаксический анализатор, схему XML и представление, которое заполнит набор записей, поэтому все изменения будут правдоподобными.


Обновить

Я не могу опубликовать код или значения XML, но это структура XML и фактические теги.

<?xml version='1.0' encoding='utf-8'?>
<root>
    <entity>

        <header>
            <field type="const">C1</field>
            <field type="const">C2</field>

            <field type="count" />
            <field type="sum" precision="2">some_recordset_field</field> 

            <field type="const">C3</field>
            <field type="const">C4</field>
            <field type="const">C5</field>
        </header>

        <detail>
            <field type="enum" fieldName="some_recordset_field">
                <match value="0">M1</match>
                <match value="1">M2</match>
            </field>
            <field type="const">C6</field>

            <field type="const">C7</field>
            <field type="const">C8</field>
            <field type="var" format="0000000000">some_recordset_field</field>
            <field type="var" format="MMddyyyy">some_recordset_field</field>
            <field type="var" format="0000000000" precision="2">some_recordset_field</field>
            <field type="var" format="0000000000">some_recordset_field</field>
            <field type="enum" fieldName ="some_recordset_field">
                <match value="0">M3</match>
                <match value="1">M4</match>
            </field>
            <field type="const">C9</field>
        </detail>

    </entity>
</root>

person PedroC88    schedule 25.02.2011    source источник
comment
Если бы вы могли предоставить образец кода, это действительно помогло бы - на данный момент это немного сбивает с толку.   -  person Jon Skeet    schedule 25.02.2011
comment
было бы хорошо, если бы вы сказали: мне нужно что-то сделать для этого   -  person Fredou    schedule 25.02.2011
comment
Вы должны использовать дженерики, но нам нужен фрагмент кода.   -  person xanatos    schedule 25.02.2011
comment
Хотел бы я ... в .net-1.1 нет дженериков   -  person PedroC88    schedule 25.02.2011
comment
Тогда живите счастливым боксом. Если кто-то заплатит вам за программирование на .NET 1.1 в 2011 году, то он будет более чем счастлив жить с боксом! :-)   -  person xanatos    schedule 25.02.2011
comment
Не думаю, что моего босса это волнует ... Это я хочу этого избежать. Я люблю следовать рекомендованной процедуре, если у меня нет выбора;)   -  person PedroC88    schedule 25.02.2011
comment
@ PedroC88 Если вы не можете создать класс со строгой типизацией, куда помещать частичные числа, я не думаю, что вы можете что-то сделать в 1.1. Единственное, что вы можете сделать, - это предварительно отформатировать данные, чтобы у вас всегда была строка. Но я думаю, ваша проблема не в упаковке или распаковке, а в том, что после распаковки вы должны заново открыть тип, чтобы отформатировать его соответствующим образом, верно? Если это так, то вы можете поместить свое значение в объект с перегрузкой ToString, чтобы при его восстановлении вам оставалось только вызвать виртуальную ToString. Вы даже можете поместить в класс другие методы, которые знают, как управлять значением.   -  person xanatos    schedule 26.02.2011
comment
@xanatos Не совсем ... Типы значений сохраняют свой foo.GetType () неизменным при упаковке, поэтому даже двойники знают, что они двойники. Таким образом, функция Format (встроенная в .NET) знает, как отформатировать ее, даже если она помещена в объект.   -  person PedroC88    schedule 01.03.2011
comment
@ PedroC88 Я думал, вы хотите перегрузить ToString (форматируйте каждый тип вручную). Мой ответ был основан на том, что стандартного ToString () вам недостаточно (или что вы хотите указать параметры ToString для тех типов, которые его поддерживают)   -  person xanatos    schedule 01.03.2011
comment
Нет ... Моя проблема заключается в преобразовании нескольких объектов в общий на .Net 1.1   -  person PedroC88    schedule 01.03.2011


Ответы (1)


Вы пробовали использовать тип var? Таким образом, вам не нужно знать тип каждого узла. Также будет полезен небольшой образец вашего сценария.

person Julio Casal    schedule 25.02.2011
comment
Бвааааааааааааааааааааааааааааааааааааааааааа! var НЕ это! Это ярлык компилятора. Компилятор присвоит тип во время компиляции. Это статично, как скала! - person xanatos; 25.02.2011
comment
И ссылка, чтобы вы знали stackoverflow.com/questions/1552881/ - person xanatos; 25.02.2011