gpt4 book ai didi

c# - 与字典替代的协方差?

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

我正在将一些类字段输出到 XML。我不知道每个字段是什么,但我检查它是 IEnumerable 还是 IDictionary,因为我需要以一种方式处理字段,以其他方式处理集合,并以另一种方式处理字典。

您可以通过最后一个方法“DictionaryToXml”看到我的问题。字典不是协变的。换句话说 IDictionary<object, object> dict = new IDictionary<string, string>();会抛出异常

如何做到这一点,有什么解决方法吗?

        public static string ClassToXml(object o)
{
string observeable;
observeable = o.GetType().ToString();
XElement root = new XElement(observeable);

FieldInfo[] fields = o.GetType().GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
foreach (FieldInfo f in fields)
{
try
{
string nam = f.Name;
if (f.FieldType.GetInterface("IDictionary") != null)
{
XElement child = DictionaryToXml(o, f);
root.Add(child);
}
else if (f.FieldType.GetInterface("IEnumerable") != null && f.FieldType != typeof(string))
{
XElement child = EnumerableToXml(o, f);
root.Add(child);
}
else
{
XElement child = FieldToXml(o, f);
root.Add(child);
}
}
catch(Exception ex) { continue; }
}



observeable = root.ToString();
return "";
}
static XElement FieldToXml(object o, FieldInfo f)
{
string nam = f.Name;
object val = f.GetValue(o);
string stringed = val != null ? val.ToString() : "";
XElement child = new XElement(nam, stringed, new XAttribute("type", "field"));
return child;
}
static XElement EnumerableToXml(object o, FieldInfo f)
{
string nam = f.Name;
XElement container = new XElement(nam, new XAttribute("type", "enumerable"));


IEnumerable<object> vals = (IEnumerable<object>)f.GetValue(o);
foreach (object obj in vals)
{
string stringed = obj.ToString();

XElement child = new XElement("value", stringed);
container.Add(child);
}

return container;
}
static XElement DictionaryToXml(object o, FieldInfo f)
{
string nam = f.Name;
XElement container = new XElement(nam, new XAttribute("type", "dictionary"));

IDictionary<object, object> dict = (IDictionary<object, object>)f.GetValue(o);
List<KeyValuePair<object, object>> vals = dict.ToList();
foreach (object obj in vals)
{
//some code
}

return container;
}

最佳答案

您正在检查非通用 Dictionary 接口(interface),那么为什么不使用它呢?

static XElement DictionaryToXml(object o, FieldInfo f)
{
string nam = f.Name;
XElement container = new XElement(nam, new XAttribute("type", "dictionary"));

IDictionary dict = (IDictionary)f.GetValue(o);
foreach (DictionaryEntry obj in dict)
{
//some code using obj.Key and obj.Value
}

return container;
}

可以使用更多的反射来找出您使用的是什么类型的字典,但是由于您只是试图转换为 <object, object>没有意义 - 你会得到 object来自非通用接口(interface)的键和值。

(同样,您正在检查 IEnuemrable ,但转换 IEnumerable<object> ,这可能会误导您。)

关于c# - 与字典替代的协方差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34060228/

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