Что значит поместить DataMemberAttribute на элемент интерфейса? - PullRequest
8 голосов
/ 25 января 2011

Что значит поместить DataMemberAttribute на элемент интерфейса? Как это влияет на производные классы?

Ответы [ 3 ]

10 голосов
/ 25 января 2011

Как показано в следующей подписи, атрибут DataMember не наследуется

[AttributeUsageAttribute(AttributeTargets.Property|AttributeTargets.Field, Inherited = false, 
    AllowMultiple = false)]
public sealed class DataMemberAttribute : Attribute

Следовательно, имеет мало смысла украшать элементы интерфейса этим атрибутом, так как вам придется украшать члены реализующих классовс этим атрибутом тоже.

1 голос
/ 25 января 2011

В моем случае я использую эти атрибуты со своими службами WCF. Когда я делаю интерфейс для веб-службы WCF, я делаю это, определяя интерфейс следующим образом:

Imports System.ServiceModel
<ServiceContract()>
Public Interface IClientContract

    <OperationContract()>
    Function GetClientList() As IList(Of POCOClients)

End Interface

Как видите, клиент этого сервиса получит класс POCOCLient. Затем мне нужно украсить класс POCOClient атрибутами, которые вы запрашиваете, таким образом, чтобы класс был правильно сериализован и отправлен через WCF.

<DataContract()>
<MetadataType(GetType(POCOAuthorizedkeys.POCOAuthorizedkeysMetaData))>
Public Class POCOAuthorizedkeys

    <DataMember()>
    <DisplayName("Id")>
    Public Property Id As Integer
    <DataMember()>
    <DisplayName("IdPackage")>
    Public Property IdPackage As Integer
    <DataMember()>
    <DisplayName("AuthorizedKey")>
    Public Property AuthorizedKey As String
    <DataMember()>
    <DisplayName("IdUnthrustedClient")>
    Public Property IdUnthrustedClient As Nullable(Of Integer)

 End Class
0 голосов
/ 25 января 2011

Атрибут [DataMember], когда применяется к элементу типа, указывает, что этот элемент является частью контракта данных. Когда этот атрибут применяется к полю или свойству явно, он указывает, что значение элемента будет сериализовано объектом DataContractSerializer (взято из Article )

...