gpt4 book ai didi

c# - 通用方法中的 Linq-to-XML 显式转换

转载 作者:行者123 更新时间:2023-12-02 19:42:29 26 4
gpt4 key购买 nike

我寻找过类似的问题,但唯一接近的问题最终并没有帮助我。

我有一个如下所示的 XML 文件:

<Fields>
<Field name="abc" value="2011-01-01" />
<Field name="xyz" value="" />
<Field name="tuv" value="123.456" />
</Fields>

我正在尝试使用 Linq-to-XML 从这些字段获取值。这些值的类型可以是 DecimalDateTimeStringInt32。我能够使用相对简单的查询一一获取字段。例如,我使用以下命令从名称为“abc”的字段中获取“值”:

private DateTime GetValueFromAttribute(IEnumerable<XElement> fields, String attName)
{
return (from field in fields
where field.Attribute("name").Value == "abc"
select (DateTime)field.Attribute("value")).FirstOrDefault()
}

这被放置在一个单独的函数中,该函数仅返回该值,并且一切正常(因为我知道只有一个元素的 name 属性设置为“abc”)。但是,由于我必须对小数、整数和日期执行此操作,所以我想知道是否可以创建一个适用于所有情况的通用函数。这就是我被困住的地方。这是我到目前为止所拥有的:

private T GetValueFromAttribute<T>(IEnumerable<XElement> fields, String attName)
{
return (from field in fields
where field.Attribute("name").Value == attName
select (T)field.Attribute("value").Value).FirstOrDefault();
}

它无法编译,因为它不知道如何从 String 转换为 T。我尝试装箱和拆箱(即 select (T) (Object) field.Attribute("value").Value 但会抛出运行时 Specifiedcast is not valid 异常,如下所示例如,它试图将 String 转换为 DateTime

这在通用函数中可能吗?我可以对通用函数施加约束以使其起作用吗?或者我是否必须有单独的函数才能利用 Linq-to-XML 的显式转换运算符?

最佳答案

你可以尝试这样做:

public static T GetValueFromAttribute<T>(IEnumerable<XElement> fields, String attName)
{
return (from field in fields
where field.Attribute("name").Value == attName
select (T)Convert.ChangeType(field.Attribute("value").Value, typeof(T))).FirstOrDefault();
}

它将适用于 DateTime、int 等(所有实现 IConvertible 的类型)。

关于c# - 通用方法中的 Linq-to-XML 显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4922855/

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