Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF中的动态对象不可能?_C#_Wcf_Serialization - Fatal编程技术网

C# WCF中的动态对象不可能?

C# WCF中的动态对象不可能?,c#,wcf,serialization,C#,Wcf,Serialization,在用WCF(json)构建响应时,我非常确定不可能使用完全动态的对象,但我只是想先在这里仔细检查一下 理想的回答应该是: "userTypes" : { "BartSimpson" : { "url" : "foo", "de

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

理想的回答应该是:

"userTypes"  :
                    {
                        "BartSimpson" :
                            {
                                "url" : "foo",
                                "desc" : "bar"
                            },
                        "LisaSimpson" :
                            {
                                "url" : "foo",
                                "desc" : "bar"
                            }
                    }
在“编译”代码中,可以通过以下体系结构(稍微伪代码)执行上述操作:


但是我的主要目标是,
BartSimpson
LisaSimpson
不是“编译”的,因此我可以有任意数量的
字符
类,在响应中有任意名称/标识。

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

您可以尝试以下输出动态结果的简单方法:

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();
}
公共字符串GetData(字符串comaSeparatedNames)
{
字符串[]名称=comaSeparatedNames.Split(',');
动态d=新的ExpandooObject();
动态dNames=新的ExpandoObject();
foreach(名称中的变量名称)
{
动态属性=新的ExpandooObject();
properties.url=“foo”;
properties.desc=“bar”;
添加(名称、属性);
}
添加(“用户类型”,dNames);
var s=JsonSerializer.Create();
var sb=新的StringBuilder();
使用(var sw=新的StringWriter(sb))
{
s、 序列化(sw,d);
}
//反序列化样本
//动态虚拟对象=新的ExpandooObject();
//var instance=s.Deserialize(新StringReader(sb.ToString()),
//dummy.GetType());
//var foo=instance.userTypes.BartSimpson.url;
使某人返回字符串();
}

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

Edit:我假设您正在使用
Newtonsoft.Json
进行序列化。感谢您提供了如此全面的代码示例。我目前正在研究它。不幸的是,现在我的返回类型定义为
字符串,我的响应似乎已转义了所有值。没关系,我在这里找到了解决方案:好的,这是这是一个非常棒的解决方案,非常感谢。我注意到了一些很酷的事情:动态属性也可以按以下方式添加:(d为IDictionary)。添加(“bart simpson”,bart);`Yes-这允许属性之间带有“空格”。而且
bart
可以是强类型类,因此您可以将
ExpandoObject
与强类型对象混合匹配。
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();
}
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();
}