Если вы не хотите использовать наследование, что-то вроде:
[DataContract]
public class User
{
}
[DataContract]
public class Service1User : User
{
[DataMember] public string PropertyVisibleOnlyForService1{...}
}
[DataContract]
public class Service2User : User
{
[DataMember] public string PropertyVisibleOnlyForService2{...}
}
[ServiceContract]
public interface IService1
{
List<Service1User> GetUsers(); // user with 'PropertyVisibleOnlyForService1' inside
}
[ServiceContract]
public interface IService2
{
List<Service2User> GetUsers(); // user with 'PropertyVisibleOnlyForService2' inside
}
Тогда я не уверен, что ты будешь делать. Ваша сортировка нарушает принципы объявления типов в этот момент. Думайте об этом обычным способом .NET; если вы определяете «Пользователь» в своем приложении, то он везде одинаковый. Некоторые свойства не могут быть скрыты от некоторых других классов или методов.
WCF также собирается упаковать эту информацию о типе в сгенерированный WSDL, и он собирается определить тип пользователя только один раз, поэтому ему нужно знать, какие свойства там есть.
Теперь, если все, что вас волнует, - это собственно созданное сообщение SOAP, и вас не волнует WSDL или то, что увидят все клиенты, сгенерированные из WSDL, то технически вы можете сделать так, чтобы оно не передавало это свойство в сообщение SOAP, когда оно нулевое, путем:
[DataMember(EmitDefaultValue=false)]
Тогда, когда это свойство равно нулю, оно не будет включено в сериализацию. Это не имело бы никакого значения, если бы клиент был сгенерирован из WSDL, так как его тип User по-прежнему должен содержать оба свойства. Это просто изменило бы сериализацию так, чтобы вместо отправки клиенту что-то вроде:
<User>
<PropertyVisibleOnlyForService1 nil="true" />
<PropertyVisibleOnlyForService2>something</PropertyVisibleOnlyForService2>
</User>
вместо этого будет отправлено:
<User>
<PropertyVisibleOnlyForService2>something</PropertyVisibleOnlyForService2>
</User>