gpt4 book ai didi

c# - 通过发送 XmlEnumAttribute c# 获取枚举的元素?

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

我通常不必问问题,因为大多数时候我会在互联网上找到我需要的东西,但现在我还没有找到获得这个的方法:

假设我在这个枚举中有大约 50000 个枚举元素:

public enum myEnum
{
[System.Xml.Serialization.XmlEnumAttribute("01010101")]
Item01010101,
[System.Xml.Serialization.XmlEnumAttribute("10101500")]
Item10101500
}

我想做的是通过传递元素的 XmlEnumAttribute 的字符串值来获取元素值,例如

object.ItsEnumValue = getEnumElement("01010101");

// Function which will return the element of the enum.
public myEnum getEnumElement(string xmlAttributeValue)
{
// The function should return the enum element, not using a switch statement
return myEnum.Item01010101;
}

有没有办法不用 switch 语句来做到这一点?我希望你能帮助我,谢谢。

最佳答案

你有几个方法可以解决这个问题。

首先,您可以使用反射通过 typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.Static) 循环遍历所有枚举值,与此 this answer 中的做法类似:

public static partial class XmlEnumExtensions
{
public static TEnum FromReflectedXmlValue<TEnum>(this string xml) where TEnum : struct, IConvertible, IFormattable
{
// Adapted from https://stackoverflow.com/questions/35294530/c-sharp-getting-all-enums-value-by-attribute
var obj = (from field in typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.Static)
from attr in field.GetCustomAttributes<XmlEnumAttribute>()
where attr != null && attr.Name == xml
select field.GetValue(null)).SingleOrDefault();
if (obj != null)
return (TEnum)obj;

// OK, maybe there is no XmlEnumAttribute override so match on the name.
return (TEnum)Enum.Parse(typeof(TEnum), xml, false);
}
}

然后像这样使用它:

obj.ItsEnumValue = "01010101".FromReflectedXmlValue<myEnum>();

但是,这在 [Flags] 时不起作用。属性被应用。例如,给定以下枚举:

[Flags]
public enum myFlagsEnum
{
[System.Xml.Serialization.XmlEnumAttribute("Flag0")]
Zero = (1 << 0),
[System.Xml.Serialization.XmlEnumAttribute("Flag1")]
One = (1 << 1),
}

来自值 myFlagsEnum.Zero | myFlagsEnum.OneXmlSerializer会生成如下组合字符串,不能单纯通过反射找到:Flag0 Flag1。也不清楚当多个 XmlEnumAttribute 属性应用于给定枚举值时会发生什么,或者只有一些枚举值应用了 XmlEnumAttribute

为了处理包括上述在内的所有可能的边缘情况,我建议使用以下第二种方法直接反序列化 XML:

public static partial class XmlExtensions
{
static XmlExtensions()
{
noStandardNamespaces = new XmlSerializerNamespaces();
noStandardNamespaces.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd attributes.
}

readonly static XmlSerializerNamespaces noStandardNamespaces;
internal const string RootNamespace = "XmlExtensions";
internal const string RootName = "Root";

public static TEnum FromXmlValue<TEnum>(this string xml) where TEnum : struct, IConvertible, IFormattable
{
var element = new XElement(XName.Get(RootName, RootNamespace), xml);
return element.Deserialize<XmlExtensionsEnumWrapper<TEnum>>().Value;
}

public static T Deserialize<T>(this XContainer element, XmlSerializer serializer = null)
{
using (var reader = element.CreateReader())
{
object result = (serializer ?? new XmlSerializer(typeof(T))).Deserialize(reader);
if (result is T)
return (T)result;
}
return default(T);
}

public static string ToXmlValue<TEnum>(this TEnum value) where TEnum : struct, IConvertible, IFormattable
{
var root = new XmlExtensionsEnumWrapper<TEnum> { Value = value };
return root.SerializeToXElement().Value;
}

public static XElement SerializeToXElement<T>(this T obj)
{
return obj.SerializeToXElement(null, noStandardNamespaces); // Disable the xmlns:xsi and xmlns:xsd attributes by default.
}

public static XElement SerializeToXElement<T>(this T obj, XmlSerializer serializer, XmlSerializerNamespaces ns)
{
var doc = new XDocument();
using (var writer = doc.CreateWriter())
(serializer ?? new XmlSerializer(obj.GetType())).Serialize(writer, obj, ns);
var element = doc.Root;
if (element != null)
element.Remove();
return element;
}
}

[XmlRoot(XmlExtensions.RootName, Namespace = XmlExtensions.RootNamespace)]
[XmlType(IncludeInSchema = false)]
public class XmlExtensionsEnumWrapper<TEnum>
{
[XmlText]
public TEnum Value { get; set; }
}

这保证了在所有情况下与 XmlSerializer 的兼容性 - 通过实际使用它。然后同样做:

obj.ItsEnumValue = "01010101".FromXmlValue<myEnum>();

样本 fiddle .

关于c# - 通过发送 XmlEnumAttribute c# 获取枚举的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42990069/

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