gpt4 book ai didi

c# - WCF 中的动态对象不可能吗?

转载 作者:太空狗 更新时间:2023-10-29 21:39:55 28 4
gpt4 key购买 nike

在 WCF (json) 中构建响应时,我很确定不可能使用完全动态的对象,但只是想先在这里仔细检查一下。

理想的回应应该是这样的:

"userTypes"  :
{
"BartSimpson" :
{
"url" : "foo",
"desc" : "bar"
},
"LisaSimpson" :
{
"url" : "foo",
"desc" : "bar"
}
}

在“已编译”代码中,上述内容可以通过以下架构(略微伪代码)执行:

public class Character{
string url {get;set;}
string desc{get;set;}
}

public class UserTypes{
public Character BartSimpson{get;set;}
public Character LisaSimpson{get;set;}
}

但我的主要目标是 BartSimpsonLisaSimpson 没有被“编译”,所以我可以拥有任意数量的 Character 类,其中 < em>响应中的任何名称/标识符。

最佳答案

在您的服务实现类的顶部添加以下using(确保您还在项目中添加了正确的引用):

using Newtonsoft.Json;
using System.Dynamic;
using System.IO;
using System.Text;

你可以试试这个输出动态结果的简单方法:

public string GetData()
{
dynamic d = new ExpandoObject();
dynamic bartSimpson = new ExpandoObject();
dynamic lisaSimpson = new ExpandoObject();
bartSimpson.url = "foo";
bartSimpson.desc = "bar";
lisaSimpson.url = "foo";
lisaSimpson.desc = "bar";
d.userTypes = new ExpandoObject();
d.userTypes.BartSimpson = bartSimpson;
d.userTypes.LisaSimpson = lisaSimpson;
var s = JsonSerializer.Create();
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{
s.Serialize(sw, d);
}
return sb.ToString();
}

要更进一步(您只需在 comaSeparatedNames 值中传递 Bart 和 Lisa),您可以这样做:

public string GetData(string comaSeparatedNames)
{
string[] names = comaSeparatedNames.Split(',');
dynamic d = new ExpandoObject();
dynamic dNames = new ExpandoObject();
foreach (var name in names)
{
dynamic properties = new ExpandoObject();
properties.url = "foo";
properties.desc = "bar";
((IDictionary<string, object>)dNames).Add(name, properties);
}
((IDictionary<string, object>)d).Add("userTypes", dNames);

var s = JsonSerializer.Create();
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{
s.Serialize(sw, d);
}

// deserializing sample
//dynamic dummy = new ExpandoObject();
//var instance = s.Deserialize(new StringReader(sb.ToString()),
// dummy.GetType());
//var foo = instance.userTypes.BartSimpson.url;

return sb.ToString();
}

注意:我还提供了用于反序列化的行(注释)。

关于c# - WCF 中的动态对象不可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17806811/

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