Есть 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) использование типа объекта для поля и приведение его динамического типа кнеобходимый тип.Но в любом случае, если мне понадобятся вызовы для конкретных объектов, мне нужно будет выполнить статическое приведение.
Я был бы рад прочитать ваши мысли / предложения