Хранение свойства типа, указанного в строке - PullRequest
0 голосов
/ 21 июля 2011

Есть XML-схема, которая говорит что-то вроде этого:

<ExtraFields>
  <ExtraField Type="Int">
   <Key>Mileage</Key>
   <Value>500000 </Value>
  </ExtraField>
  <ExtraField Type="String">
   <Key>CarModel</Key>
   <Value>BMW</Value>
  </ExtraField>
  <ExtraField Type="Bool">
   <Key>HasAbs</Key>
   <Value>True</Value>
  </ExtraField>    
</ExtraFields>

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

     static class Consts
{
    public const string Int32Type = "int32";
    public const string StringType = "string";
    public const string BoolType = "bool";
}

public class ExtraFieldValue<TValue>
{
    public string Key;
    public TValue Value;public static ExtraFieldValue<TValue> CreateExtraField(string strType, string strValue, string strKey)
    {
        IDictionary<string, Func<string, object>> valueConvertors = new Dictionary<string, Func<string, object>> {
                  { Consts.Int32Type, value => Convert.ToInt32(value)},
                  { Consts.StringType, value => Convert.ToString(value)},
                  { Consts.BoolType, value => Convert.ToBoolean(value)}
        };

        if (!valueConvertors.ContainsKey(strType))
            return null;

        ExtraFieldValue<TValue> result = new ExtraFieldValue<TValue>
        {
            Key = strKey,
            Value = (TValue)valueConvertors[strType](strValue)
        };

        return result;
    }

}

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

Я могу толькопредставьте себе два варианта:

1) использование динамического ключевого слова для этого поля, но этот подход, похоже, имеет ограничения

2) использование типа объекта для поля и приведение его динамического типа кнеобходимый тип.Но в любом случае, если мне понадобятся вызовы для конкретных объектов, мне нужно будет выполнить статическое приведение.

Я был бы рад прочитать ваши мысли / предложения

1 Ответ

1 голос
/ 21 июля 2011

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

Итак, просто используйте коллекцию имя / значение, как что-то, что реализует IDictionary<string, object>.

...