gpt4 book ai didi

C# 将字符串数据表示形式转换为类型化

转载 作者:太空宇宙 更新时间:2023-11-03 17:18:40 24 4
gpt4 key购买 nike

现在我正在编写一个从 XML 加载配置数据的通用方法。在我的案例中,很多参数都存储在节点属性中,所以我决定编写一个通用的属性读取方法:

    private static T ReadAttribute<T>(XElement Element,string AttributeName)
{
var attrib = Element.Attribute(AttributeName);

if (attrib != null)
{
return attrib.Value; // off cource error is in this line !
}
else
{
return default(T);
}
}

此方法应尝试读取具有指定名称的属性,如果未读取此属性,则应返回属性类型的默认值。属性类型由 T 指定。如上面的评论所示,我的问题是我无法将字符串值普遍转换为特定类型。实际上我打算使用 int、double 和两个枚举类型作为 T。
在这种情况下我应该采取什么方式?我应该如何将字符串值转换为T类型?
提前致谢!

最佳答案

您可以使用 Convert.ChangeType。它基本上做你想要的。但这是转换而不是转换,好吧,不仅仅是转换。

return (T)Convert.ChangeType(attrib.Value, typeof(T), CultureInfo.InvariantCulture);

您可以简单地将字符串转换为某种任意类型的原因是类型系统不允许这样做。但是 Convert.ChangeType 返回可以是任何类型的对象,因此允许转换。

CultureInfo.InvariantCulture 很重要,因为不应使用不同的文化对 XML 内容进行编码/解码。如果使用 XML,则应使用 XmlConvert 类,但它没有像 XmlConvert.ChangeType 这样方便的通用方法。

XAttribute 类有许多映射到 XmlConvert 类的显式用户定义转换。但是,您不能简单地将它们与不受约束的类型参数 T 一起使用并期望得到相同的结果。

更糟糕的是,XML 和 Convert 实际上并没有很好地发挥作用。因此,如果您真的对此很认真,您会编写类似这样的代码来处理转换。

static T ConvertTo<T>(XAttribute attr)
{
object value;
switch (Type.GetTypeCode(typeof(T)))
{
case TypeCode.Boolean: value = XmlConvert.ToBoolean(attr.Value); break;
case TypeCode.Int32: value = XmlConvert.ToInt32(attr.Value); break;
case TypeCode.DateTime: value = XmlConvert.ToDateTime(attr.Value); break;
// Add support for additional TypeCode values here...
default:
throw new ArgumentException(string.Format("Unsupported destination type '{0}'.", typeof(T)));
}
return (T)value;
}

关于C# 将字符串数据表示形式转换为类型化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5753628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com