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