存储字符串中指定类型的属性

本文关键字:类型 属性 字符串 存储 | 更新日期: 2023-09-27 18:02:55

有这样一个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;
    }
}

但是这种方法的问题是,我需要一个extraffields列表,每个字段在列表中可以有不同的类型。

到目前为止,我只能想到两个选项:

1)为该字段使用动态关键字,但这种方法似乎有限制

2)为字段使用对象类型,并将其动态类型强制转换为必要的类型。但是无论如何,如果我需要一些对象特定的调用,我将不得不进行静态强制转换。

我很高兴能读到你的想法/建议

存储字符串中指定类型的属性

只需使用名称/值集合。如果您直到运行时才知道属性名称,那么使用dynamic或在运行时动态构建类型不会对您有帮助,因为您将无法编写访问这些属性的源代码。

所以,只要使用名称/值集合,就像实现IDictionary<string, object>一样。