我是否可以停止WCF生成ArrayOfString而不是string[]或List<;字符串>;
我对WCF服务代理有一个小问题,其中消息包含我是否可以停止WCF生成ArrayOfString而不是string[]或List<;字符串>;,wcf,Wcf,我对WCF服务代理有一个小问题,其中消息包含List作为参数 我正在使用Visual Studio中的“添加服务引用”生成对我的服务的引用 // portion of my web service message public List<SubscribeInfo> Subscribe { get; set; } public List<string> Unsubscribe { get; set; } 生成的ArrayOfString类如下所示。这是
List
作为参数
我正在使用Visual Studio中的“添加服务引用”生成对我的服务的引用
// portion of my web service message
public List<SubscribeInfo> Subscribe { get; set; }
public List<string> Unsubscribe { get; set; }
生成的ArrayOfString类如下所示。这是在我的代码中生成的类-它不是.NET类。它实际上为我生成了一个从列表继承的类,但并没有为我创建任何构造函数的“体面”
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.CollectionDataContractAttribute(Name="ArrayOfString", Namespace="http://www.example.com/", ItemName="string")]
[System.SerializableAttribute()]
public class ArrayOfString : System.Collections.Generic.List<string> {
}
我真的很喜欢这个给我的干净的外观
现在来看实际问题:
我无法将List
分配给Unsubscribe
属性,该属性是ArrayOfString
——即使它从List继承。事实上,如果没有额外的语句,我似乎找不到任何方法来分配它
我尝试了以下方法:
-此构造函数不存在:-(新建ArrayOfString(unsubscribfrom.ToList())
- 更改代码生成器使用的数组类型-不起作用-它总是给我ArrayOfString(!?)
- 尝试将
强制转换为List
-失败,出现“无法强制转换”,即使它编译得很好ArrayOfString
- 创建
,然后newarrayofstring()
-可以工作,但我不能在一个语句中完成所有工作AddRange(unsubscribed from.ToList())
- 创建一个转换函数
,该函数可以工作,但没有我想要的那么干净到ArrayOfstring(List)
我遗漏了什么吗?有没有办法告诉它不要生成
ArrayOfString
-或者其他一些分配它的技巧?如果您使用VS 2008来使用服务,那么有一个简单的解决方案
单击添加服务引用时显示的代理对话框上的“高级…”按钮。在“集合类型”下拉列表中,您可以选择System.Generic.List。方法返回列表现在应该可以正常工作
(希望这就是您所要求的,我有点累了,而且这个问题对我来说有点难理解。)首先,我不希望跨服务边界返回泛型类型。相反,返回Unsubscribe作为
字符串[]
,SubscriptionInfo作为SubscriptionInfo[]
。如有必要,可以轻松地将阵列转换为客户端上的常规列表,如下所示:
Unsubscribe = new List<string>(unsubscribeFrom);
Subscribe = new List<SubscriptionInfo>(subscribeTo);
Unsubscribe=新列表(取消订阅);
订阅=新列表(subscribeTo);
实现名为“Add”的方法的任何.NET对象都可以像数组或字典一样初始化
由于ArrayOfString实现了一个“Add”方法,您可以像这样初始化它:
var a = new ArrayOfString { "string one", "string two" };
但是,如果确实希望基于另一个集合对其进行初始化,可以为此编写扩展方法:
public static class U
{
public static T To<T>(this IEnumerable<string> strings)
where T : IList<string>, new()
{
var newList = new T();
foreach (var s in strings)
newList.Add(s);
return newList;
}
}
公共静态类U
{
公共静态T到(此IEnumerable字符串)
其中T:IList,new()
{
var newList=newt();
foreach(字符串中的变量s)
新列表。添加(s);
返回newList;
}
}
用法:
client.UpdateMailingList(new UpdateMailingListMsgIn()
{
Email = model.Email,
Name = model.Name,
Source = Request.Url.ToString(),
Subscribe = subscribeTo.ToList(),
Unsubscribe = unsubscribeFrom.To<ArrayOfString>()
});
client.updateEmailingList(新的updateEmailingListMsgin()
{
Email=model.Email,
Name=model.Name,
Source=Request.Url.ToString(),
Subscribe=subscribeTo.ToList(),
Unsubscribe=从.To()取消订阅
});
为时已晚,但可以在未来帮助人们
使用svcutil并显式通知命令行util您希望代理类由XmlSerializer而不是DataContractSerializer(默认)序列化。以下是示例:
svcutil/out:c:\Path\Proxy.cs/config:c:\Path\Proxy.config/async/serializer:XmlSerializer/namespace:*,YourNamespace
请注意,web服务是一个ASP.NET web服务好吗?!我也累了!我一直在写太长的问题。如果不清楚,很抱歉。我想你已经理解了!不幸的是,你的建议不起作用-它坚持为字符串创建一个新的ArrayOfString类,不管我选择了什么!也许它会被弄糊涂了墨迹字符串是一种值类型?嗯。我必须测试它。不幸的是,我今天的工作日程安排有点繁忙。这本质上就是“服务引用”和“web引用”之间的区别吗?指定服务引用是否使用DataContractSerializer,而web引用是否使用XmlSerializer?请参阅
public static class U
{
public static T To<T>(this IEnumerable<string> strings)
where T : IList<string>, new()
{
var newList = new T();
foreach (var s in strings)
newList.Add(s);
return newList;
}
}
client.UpdateMailingList(new UpdateMailingListMsgIn()
{
Email = model.Email,
Name = model.Name,
Source = Request.Url.ToString(),
Subscribe = subscribeTo.ToList(),
Unsubscribe = unsubscribeFrom.To<ArrayOfString>()
});