有一种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;
}
}
但是这种方法的问题是我需要一个ExtraField列表,每个ExtraField都可以在列表中有不同的类型。
到目前为止,我只能想到两个选项:
1)为此字段使用动态关键字,但此方法似乎有限制
2)使用字段的对象类型并将其动态类型转换为必要的类型。但无论如何,如果我需要一些特定于对象的调用,我将不得不进行静态演员。
我很高兴看到你的想法/建议
答案 0 :(得分:1)
只需使用名称/值集合。如果您在运行时甚至不知道属性名称,使用dynamic
或在运行时动态构建类型对您没有帮助,因为您将无法编写访问这些属性的源代码。
因此,只需使用名称/值集合来实现IDictionary<string, object>
。