У меня небольшая проблема с прокси-серверами WCF, где сообщение содержит List<string>
в качестве параметра.
Я использую «Добавить ссылку на службу» в Visual Studio, чтобы сгенерировать ссылку на мою службу.
// portion of my web service message
public List<SubscribeInfo> Subscribe { get; set; }
public List<string> Unsubscribe { get; set; }
Это сгенерированные свойства моего MsgIn
для одного из моих веб-методов.
Вы можете видеть, что он использовал 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");
}
}
}
Созданный класс 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())
- этот конструктор не существует: - (
- изменение типа массива, используемого генератором кода - не работает - оно всегда дает мне ArrayOfString (!?)
- попытаться привести
List<string>
к ArrayOfString
- не удается выполнить «невозможно выполнить», даже если он компилируется очень хорошо
- создать
new ArrayOfString()
, а затем AddRange(unsubscribeFrom.ToList())
- работает, но я не могу сделать все это в одном утверждении
- создать функцию преобразования
ToArrayOfString(List<string>)
, которая работает, но не так чиста, как я хочу.
Это только делает для строки, что раздражает.
Я что-то упустил? Есть ли способ сказать ему не генерировать ArrayOfString
- или какой-то другой трюк, чтобы назначить его?