我想在WCF中返回一个匿名类型。这是否可行?
您不能使用匿名类型,但也许您在谈论WCF和未经类型化的消息?
在WCF中有一个选项,只需定义一个Message
类型的参数(可能还有相同类型的返回值)。这只是发送到WCF的原始消息(并从中返回)。
我找不到太多好的信息 - MSDN上有一些文档,但迄今为止我看到的最好的是Kurt Claeys的博客文章WCF:在WCF操作上未经类型化的消息。
我不建议使用这种方法 - 直接处理消息内容需要更多的工作量,而这正是WCF试图使我们免受其困扰的 - 但如果您绝对必须微调消息的每一位 - 这似乎是可行的途径。
Marc
你不能从任何方法中返回匿名类型,对吗?那么为什么你可以从WCF中返回它呢?
看起来您无法使用XML序列化器进行操作,因为它会抱怨某个无参构造函数的问题,但是如果您要服务于由Dave Ward指示的ajax客户端,则json序列化器可以正常工作。
你绝对可以返回匿名类型。例如:
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();
}
{"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来返回匿名类型的集合。
您可以使用ExpandoObject。当您将DTO中的属性定义为ExpandoObject时,客户端将生成为字典:
合同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;