我正在调用通用端点
/api/foo
,它返回描述 foo
的 XML。您可以将任何实体名称作为 foo
传递,它将返回其数据。
以下是一些回复示例。 打电话时
api/foo1
:
<foo1>
<name>SomeValue</name>
<id>101</id>
</foo1>
打电话时
api/foo2
:
<foo2>
<name>SomeOtherValue</name>
<id>205</id>
</foo2>
基本上,XML 将使用路径中请求的
foo
参数打开。 (name, id) 内的字段是固定的。 foo
实体名称可以由用户定义,因此没有我可以使用的固定已知先验列表。
我正在尝试使用这个
DataContractSerializer
和这个 DataContract
: 反序列化 XML
[DataContract(Name = "foo1", Namespace = "")]
public class Foo
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "id")]
public string Id { get; set; }
}
当然,这对于
foo1
来说效果很好,但对于任何其他实体名称不起作用。
是否可以在运行时以某种方式参数化
DataContract
Name
?我正在自己构建序列化器。
此处是最小的可重现示例。第一个断言工作正常,第二个断言失败。
[DataContract(Name = "foo1", Namespace = "")]
public class Foo
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "id")]
public string Id { get; set; }
}
[Fact]
public void TestDeserialization()
{
var foo1 = "<foo1>\n\t<name>SomeValue</name>\n\t<id>101</id>\n</foo1>";
var foo2 = "<foo2>\n\t<name>SomeOtherValue</name>\n\t<id>205</id>\n</foo2>";
var serializer = new DataContractSerializer(typeof(Foo));
var objFoo1 = (Foo)serializer.ReadObject(XmlReader.Create(new StringReader(foo1)));
var objFoo2 = (Foo)serializer.ReadObject(XmlReader.Create(new StringReader(foo2)));
bjFoo1.Name.Should().Be("SomeValue");
bjFoo2.Name.Should().Be("SomeOtherValue");
}
如果您定义了端点,为什么不更改它,以便它始终返回
<foo>
并添加第三个名为 <type>
的参数。
所以 foo1 看起来像这样:
<foo>
<type>foo1</type>
<name>SomeValue</name>
<id>101</id>
</foo>
对于 foo2 来说是这样的:
<foo>
<type>foo2</type>
<name>SomeValue</name>
<id>101</id>
</foo>
在您的数据类中,您只需将其更改为:
[DataContract(Name = "foo", Namespace = "")]
public class Foo
{
[DataMember(Name = "type")]
public string Type{ get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "id")]
public string Id { get; set; }
}