gpt4 book ai didi

c# - 从 XElement 确定 DataContract 类型

转载 作者:行者123 更新时间:2023-11-30 18:04:00 24 4
gpt4 key购买 nike

我在 WCF 之外使用 System.Runtime.Serialization 命名空间,想知道元素代表什么类型 - 是否有名称解析器?我真的很喜欢以下内容:

Type ResolveName(XmlQualifiedName typeName);

我看到在 WCF 的内部工作中有类似的东西,但我似乎找不到公开的东西。

谢谢!

最佳答案

因为我仍然认为我需要此功能,所以我编写了一个类来获取信息。我使用了 Impromptu-Interface 来加速反射位,但整个过程让我感到厌烦。

public class DataContractNameResolver
{
private Type TypeOfDataContract = null;
private Dictionary<System.Xml.XmlQualifiedName, Type> xmlNames = new Dictionary<System.Xml.XmlQualifiedName, Type>();

internal void PrecacheBaseTypes(IEnumberable<Type> types)
{
if (TypeOfDataContract == null)
{
TypeOfDataContract = Type.GetType("System.Runtime.Serialization.DataContract, System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
}

lock (xmlNames)
{
var remaining = new Queue<Type>(types.Except(xmlNames.Values));

while (remaining.Count > 0)
{
Type next = remaining.Dequeue();

var dc = Impromptu.InvokeMember(TypeOfDataContract.WithStaticContext(), "GetDataContract", next);
IDataContract result = Impromptu.ActLike<IDataContract>(dc);

xmlNames.Add(new System.Xml.XmlQualifiedName(result.Name.Value, result.Namespace.Value), next);
}
}
}

public Type ResolveName(System.Xml.XmlQualifiedName typeName)
{
if (xmlNames.ContainsKey(typeName))
{
return xmlNames[typeName];
}
return null;
}
}

这个类的使用类似于:

var nameResolver = new DataContractNameResolver();
nameResolver.PrecacheBaseTypes(new[] { typeof(SampleOne), typeof(SampleTwo) });
var resultType = nameResolver.ResolveName(...);

关于c# - 从 XElement 确定 DataContract 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6636293/

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