WCF和匿名类型(WCF and Anonymous Types)

我想通过WCF返回一个匿名类型。 这可能吗?

Answer 1:

不能使用匿名类型,但也许你正在谈论WCF和非类型化的消息?

有在WCF一个选项来只定义类型的参数Message (以及可能的相同类型的返回值)。 这仅仅是原始消息去WCF(和它回来)。

我找不到太多好的信息在那里-有MSDN上的一些文档,但到目前为止,我见过的最好的是库尔特CLAEYS'的博客文章WCF:WCF上操作无类型的消息

我不建议使用这种方法 - 这是更大量繁重的工作直接处理消息内容自己,这就是WCF正试图从饶了我们 - 但如果你绝对,积极必须调整你的消息的每一位 - 这似乎是要走的路。



Answer 2:

你不能从任何方法返回一个匿名类型,你能吗? 那么,为什么你能够从WCF退货吗?



Answer 3:

看起来你不能用XML串行这样做,因为有关参数的构造函数的一些投诉,但如果你投放到Ajax客户由Dave沃德指示它的工作原理为JSON序列。



Answer 4:

好的,我明白了。 不过,如果我定义了一个类型 - MyObj中 - 为了这个目的,并纪念其成员IsRequired =假,我怎么可以创建跨+的MyObj中的实例发送只有它的一些成员? 这可能吗??

看一看[DataMember(EmitDefaultValue=false)]



Answer 5:

不它不是。 你必须预先定义你的类型。



Answer 6:

你绝对可以返回匿名类型。 这工作,例如:

public object GetLatestPost()
{
  XDocument feedXML = XDocument.Load("http://feeds.encosia.com/Encosia");

  var posts = from feed in feedXML.Descendants("item")
                   select new
                   {
                     Title = feed.Element("title").Value,
                     Link = feed.Element("link").Value,
                     Description = feed.Element("description").Value
                   };

  return posts.First();
}

如果调用该方法作为ASMX ScriptService的的WebMethod,你会从它那里得到这个JSON:

{"d":
    {"Title":"Using an iPhone with the Visual Studio development server",
     "Link":"http://feeds.encosia.com/~r/Encosia/~3/vQoxmC6lOYk/",
     "Description":" Developing iPhone-optimized portions of an ASP.NET ..."}}

您可以使用的IEnumerable返回类型返回匿名类型的集合也。



Answer 7:

您可以使用ExpandoObject。 当你在为ExpandoObject客户端作为字典生成的DTO定义属性:

合同DTO

public class TaskDTO
{
    public string Type { get; set; }
    public ExpandoObject Args { get; set; }
    public string Id { get; set; }
    public TaskDTO SuccessTask { get; set; }
    public TaskDTO FailTask { get; set; }
    public bool IsFinal { get; set; }
}

客户

using (var client = new JobServiceClient())
{
    var task = new TaskDTO
    {
        Id = Guid.NewGuid().ToString(),
        Type = "SendEmailTask",
        IsFinal = true
    };
    dynamic args = new ExpandoObject();
    args.To = "who@mail.com";
    args.Title = "test job service";
    args.Content = "test job service";
    task.Args = ((IDictionary<string, object>)args).ToDictionary(i => i.Key, i => i.Value);
    client.Execute(task);
}

服务

dynamic args = dto.Args;