我对WCF服务代理有一个小问题,其中消息包含List
作为参数.
我在Visual Studio中使用"添加服务引用"来生成对我的服务的引用.
// portion of my web service message public ListSubscribe { get; set; } public List Unsubscribe { get; set; }
这些是我MsgIn
的一个Web方法的生成属性.你可以看到它ArrayOfString
在我使用时使用List
,而另一个需要List
- 它匹配我上面的原始C#对象.
[System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false)] public System.Collections.Generic.ListSubscribe { 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的类,但没有'decency'来创建任何构造函数.
[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{ }
问题是我经常创建这样的消息:
client.UpdateMailingList(new UpdateMailingListMsgIn() { Email = model.Email, Name = model.Name, Source = Request.Url.ToString(), Subscribe = subscribeTo.ToList(), Unsubscribe = unsubscribeFrom.ToList() });
我真的很喜欢这给我带来的干净外观.
现在针对实际问题:
我不能分配List
到Unsubscribe
这是一个属性ArrayOfString
-即使它从名单继承.事实上,我似乎无法找到任何方式来分配它没有额外的声明.
我尝试过以下方法:
new ArrayOfString(unsubscribeFrom.ToList())
- 这个构造函数不存在:-(
更改代码生成器使用的数组的类型 - 不起作用 - 它总是给我ArrayOfString(!?)
尝试投List
来ArrayOfString
-失败,"无法投",尽管它编译就好了
创造new ArrayOfString()
然后AddRange(unsubscribeFrom.ToList())
- 工作,但我不能在一个声明中做到这一切
创建一个转换函数ToArrayOfString(List
,它可以工作,但不是我想要的干净.
它只为字符串做这个,这很烦人.
我错过了什么吗?有没有办法告诉它不要生成ArrayOfString
- 或者其他一些技巧来分配它?
任何实现名为"Add"的方法的.NET对象都可以像数组或字典一样进行初始化.
由于ArrayOfString实现了"添加"方法,您可以像这样初始化它:
var a = new ArrayOfString { "string one", "string two" };
但是,如果你真的想根据另一个集合初始化它,你可以为它编写一个扩展方法:
public static class U { public static T To(this IEnumerable strings) where T : IList , 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() });