WCF和匿名类型

时间:2009-10-14 15:42:56

标签: wcf anonymous-types

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

7 个答案:

答案 0 :(得分:4)

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

WCF中有一个选项可以只定义类型为Message的参数(可能还有相同类型的返回值)。这只是转到WCF的原始消息(并从它返回)。

我找不到很多好的信息 - 在MSDN上有一些文档,但到目前为止我见过的最好的是Kurt Claeys的博文WCF : Untyped messages on WCF operations

我不建议使用这种方法 - 直接自己处理消息内容是一项更加繁琐的工作,而这正是WCF试图让我们免除的 - 但如果你绝对必须调整你的每一条消息 - 这似乎是要走的路。

马克

答案 1 :(得分:3)

您无法从任何方法返回匿名类型,是吗?那你为什么能从WCF返回呢?

答案 2 :(得分:1)

  

好的,我明白了。但是如果我定义的话   一个类型 - MyObj - 为此目的和   标记其成员IsRequired = false,如何   我可以创建+发送实例   MyObj只有一部分   成员?这可能吗?

查看[DataMember(EmitDefaultValue=false)]

答案 3 :(得分:1)

看起来你不能使用XML Serializer,因为有一些关于无参数构造函数的抱怨,但如果你正在服务于dave Ward指示的ajax客户端,它适用于json序列化器。

答案 4 :(得分:0)

不,不是。您必须提前定义类型。

答案 5 :(得分:0)

您肯定可以返回匿名类型。这有效,例如:

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的返回类型来返回匿名类型的集合。

答案 6 :(得分:0)

您可以使用ExpandoObject。在DTO中将属性定义为ExpandoObject时,客户端将生成为Dictionary:

合同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;