У меня есть два класса ...
[Serializable]
[DataContract]
public class A
{
[DataMember]
public string _a { get; set; }
[DataMember]
public bool _b { get; set; }
}
[Serializable]
public class B : A
{
[NonSerialized]
[XmlIgnore]
private C _c;
}
... и у меня есть служба WCF:
public interface IClient
{
[ServiceKnownType(typeof(A))]
[OperationContract(IsOneWay = true)]
void Somefunction(List<A> listofA);
}
Мне нужно отправить список A клиенту, но у меня есть только список B. Мне плевать на поле "_c". Я бы подумал, что это так просто, как:
List<A> listofA = new List<A>();
foreach (B instanceofb in somestore.Values)
{
listofA.Add((A)instanceofb);
}
Client.Somefunction(listofA);
Но производный тип объекта хранится в экземпляре базового типа в списке. WCF, кажется, пытается десериализовать и завершиться неудачей, потому что C не сериализуем (хотя я пометил его как проигнорированный). Я не получаю ответа на стороне клиента, а метод на стороне сервера просто проваливается.
Но я могу создать и отправить (и получить на клиенте) тип A, хотя:
List<A> listofA = new List<A>() { new A() };
Client.Somefunction(listofA);
Есть ли какой-нибудь способ, кроме кропотливого (который работает):
public A Convert(B _instanceofb)
{
A _instanceofA = new A();
A._a = _instanceofb._a;
A._b = _instanceofb._b;
return A;
}
и ..
List<A> listofA = new List<A>();
foreach (B instanceofb in somestore.Values)
{
listofA.Add(Convert(instanceofb));
}
Client.Somefunction(listofA);