在WCF服务代理中,消息包含List<string>作为参数,我遇到了一个小问题。
我正在使用Visual中的“添加服务引用”来生成对我的服务的引用。
// portion of my web service message
public List<SubscribeInfo> Subscribe { get; set; }
public List<string> Unsubscribe { get; set; }这些是在我的MsgIn上为我的一个web方法生成的属性。当我使用ArrayOfString时,您可以看到它使用了List<SubscribeInfo>,而另一个使用的是List<SubscribeInfo>,它与上面的原始C#对象相匹配。
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
public System.Collections.Generic.List<DataAccess.MailingListWSReference.SubscribeInfo> Subscribe {
get {
return this.SubscribeField;
}
set {
if ((object.ReferenceEquals(this.SubscribeField, value) != true)) {
this.SubscribeField = value;
this.RaisePropertyChanged("Subscribe");
}
}
}
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)]
publicDataAccess.MailingListWSReference.ArrayOfString Unsubscribe {
get {
return this.UnsubscribeField;
}
set {
if ((object.ReferenceEquals(this.UnsubscribeField, value) != true)) {
this.UnsubscribeField = value;
this.RaisePropertyChanged("Unsubscribe");
}
}
}生成的ArrayOfString类如下所示。这是在我的代码中生成的类--它不是.NET类。它实际上生成了一个类,它继承了List,但没有创建任何构造函数的‘体面’。
[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> {
}问题是,我经常这样创建我的信息:
client.UpdateMailingList(new UpdateMailingListMsgIn()
{
Email = model.Email,
Name = model.Name,
Source = Request.Url.ToString(),
Subscribe = subscribeTo.ToList(),
Unsubscribe = unsubscribeFrom.ToList()
});我真的很喜欢这给我的干净的表情。
现在来看一下实际问题:
我不能将一个List<string>分配给Unsubscribe属性,它是一个ArrayOfString --尽管它是从List继承的。事实上,如果没有额外的语句,我似乎无法找到任何分配它的方法。
我试过以下几种方法:
new ArrayOfString(unsubscribeFrom.ToList()) --这个构造函数不存在:-(更改代码生成器使用的数组的类型的List<string>强制转换为ArrayOfString )失败,尽管它编译了精细的new ArrayOfString(),然后< code >D24 -工作,但是我不能在一个statement它只对字符串执行此操作,这是很烦人的。
我是不是遗漏了什么?有没有一种方法告诉它不要生成ArrayOfString --或者其他一些分配它的技巧?
发布于 2010-03-12 19:08:47
实现名为"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;
}
}用法:
client.UpdateMailingList(new UpdateMailingListMsgIn()
{
Email = model.Email,
Name = model.Name,
Source = Request.Url.ToString(),
Subscribe = subscribeTo.ToList(),
Unsubscribe = unsubscribeFrom.To<ArrayOfString>()
});发布于 2009-03-06 07:54:27
首先,我不喜欢跨服务边界返回泛型类型。相反,返回退订为string[],SubscriptionInfo返回为SubscriptionInfo[]。如果有必要,可以轻松地将数组转换为客户端上的通用列表,如下所示:
Unsubscribe = new List<string>(unsubscribeFrom);
Subscribe = new List<SubscriptionInfo>(subscribeTo);发布于 2011-04-19 22:07:01
太晚了,但能在未来帮助人们.
使用svcutil,并显式地通知命令行util,您希望代理类由XmlSerializer而不是DataContractSerializer序列化(默认)。这是样品:
svcutil /out:c:\Path\Proxy.cs /config:c:\Path\Proxy.config /async /serializer:XmlSerializer /namespace:*,YourNamespace
请注意,web服务是一个ASP.NET web服务,好吗?!
https://stackoverflow.com/questions/505943
复制相似问题