C# – 设计问题建议:那么不能使用词典呢?

我需要通过Web服务返回一个Dictionary(或一些List,我只是不知道),特别是通过WCF数据服务。 看起来WCF数据服务不支持字典类型。

通过Web服务看起来像这样:

 -  employee1, True employee2, False employee3, True  

我首先尝试了一个1维数组,这似乎工作,但当然只带有3个elemetns的1维数组:

 [WebGet] public string[] Employees() { return new[] { "employee1", "employee2", "employee3" }; } 

基本上,我需要一些List(?),每个都有两个参数,即EmployeeName和booleann值,IsActive。

任何建议将不胜感激。

更新:我将以下内容添加到我的Web服务中:

 public class Employee { public string Name{ get; set; } public bool IsActive{ get; set; } public Employee(string name, bool isActive) { Name = name; IsActive = isActive; } } [WebGet] public List Employees() { var emp1 = new Employee("Test1", true); var emp2 = new Employee("Test2", true); var list = new List { emp1, emp2 }; return list; } 

当像我的网络浏览器中的.svc文件一样,我在加载时得到这个:

 Request Error The server encountered an error processing the request. The exception message is 'Unable to load metadata for return type 'System.Collections.Generic.List`1[Web.Employee]' of method 'System.Collections.Generic.List`1[.Web.Employee] Employees()'.'. See server logs for more details. The exception stack trace is: at System.Data.Services.Providers.BaseServiceProvider.AddServiceOperation(MethodInfo method, String protocolMethod) at System.Data.Services.Providers.BaseServiceProvider.AddOperationsFromType(Type type) at System.Data.Services.DataService`1.CreateProvider() at System.Data.Services.DataService`1.HandleRequest() at System.Data.Services.DataService`1.ProcessRequestForMessage(Stream messageBody) at SyncInvokeProcessRequestForMessage(Object , Object[] , Object[] ) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

有任何想法吗?

更新2:

以下是有关DataService.svc类的更多信息。 我在.NET 4.0框架中使用WCF数据服务的V2:

 public class WebDataService : DataService { public static void InitializeService(DataServiceConfiguration config) { config.UseVerboseErrors = true; config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); config.SetEntitySetAccessRule("*", EntitySetRights.AllRead | EntitySetRights.AllWrite); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } 

为什么不创建一个用户定义的数据类型,其中包含两个属性:字符串和布尔值?

 public class MySillyWCFObject { boolean b; string name; public MySillyWCFObject(boolean b, string s) { this.b = b; this.name = s; } } 

然后你可以说:

 MySillyWCFObject m = new MySillyWCFObject(true, "Hi"); 

如果您不需要为此创建自己的类,则可以使用Tuple

 var tuple = Tuple.Create(true, "Hi"); 

这将通过从方法调用的参数中推断出类型来创建一个Tuple 。 然后,您可以访问true"Hi"作为Tuple.Item1Tuple.Item2

我在如何在WebService中返回通用字典之前使用过这个。

它是为您提供可序列化字典的代码。 它很棒。 我们有一个实时系统可以传递这些并且它可以完美地运行。

你可以创建一个小的传输对象类,如:

 [DataContract] public class EmployeeDTO { public EmployeeDTO(string empName,bool isActive){ EmployeeName = empName; IsActive = isActive; } [DataMember] public string EmployeeName {get;private set;} [DataMember] public bool IsActive {get;private set;} } 

你的服务方式

 [WebGet] public EmployeeDTO[] Employees(){ return new []{new EmployeeDTO("employee1",true), new EmployeeDTO("employee2",false), new EmployeeDTO("employee3",true),}; } 

你能尝试返回IQueryable而不是List吗? 您的return语句将更改为return list.AsQueryable(); 在这种情况下。 此外,您需要将[DataServiceKey]属性添加到Employee类(例如[DataServiceKey(“Name”)])。