2014-11-13 7 views
0

기본 WCF 서비스가 있습니다. 내 데이터 계약을 분리했고 그 중 하나는 많은 공공 재산이있는 클래스입니다. 클라이언트에 이러한 속성을 사용할 수있게하려면이 모든 속성에 [DataMember]가 있어야한다고 가정합니다. 따라서 많은 속성이 있으므로 [DataMember]를 사용하여 대량으로 꾸미는 방법이 있습니까? 난 단지 본 것WCF의 데이터 계약에서 DataMember를 사용하여 여러 속성을 꾸밀 수있는 방법이 있습니까?

[DataMember] 
(
    public string Title { get; set; } 
    public Guid ID { get; set; } 
    public Description { get; set; } 

    //more properties... 
) 

: 같은 것을

[DataMember] 
public string Title { get; set; } 
[DataMember] 
public Guid ID { get; set; } 
[DataMember] 
public Description { get; set; } 

답변

0

아니, 불행하게도, 그것은 속성과 속성의 그룹을 표시 할 수 없습니다.

+0

답장을 보내 주셔서 감사합니다. 그걸 기반으로 무엇을합니까? 약간의 연구가 끝난 후에도 같은 결론에 도달 했음에도 불구하고 아직 완료되지 않았다는 것을 알지 못했습니다. – sr28

+0

Resharper를 사용하는 경우 프로세스를 돕는 템플릿을 거의 만들 수 없습니다. 그런 다음 여러 속성에 대해 열 삽입 모드를 사용할 수있는 열 편집 모드가 항상 있습니다. 이것들은 도움이 될 것입니다. – Cameron

+0

3.5SP1 +를 사용하는 경우 아무 것도 지정할 필요가 없습니다. 모든 public 멤버는 serialize되지 않고 DataContract/DataMember로 표시되지 않는 유형으로 serialize됩니다. –

1

예. 이를 위해 Aspect Oriented Programming 기법을 사용할 수 있습니다. PostSharp를 사용할 때의 해결책은 다음과 같습니다. PostSharp는 Nuget (postsharp express는 무료)을 통해 설치할 수 있습니다.

먼저면을 작성해야합니다. 아래 코드를 참조하십시오.

namespace AspectOrientedProgramming 
{ 
[Serializable] 
    [MulticastAttributeUsage (MulticastTargets.Class)] 
    public sealed class DataContractAspect:TypeLevelAspect, IAspectProvider 
    { 
     public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
     { 
      var targetType = (Type) targetElement; 

      var introduceDataContractAspect = 
       new CustomAttributeIntroductionAspect(
        new ObjectConstruction(typeof(DataContractAttribute).GetConstructor(Type.EmptyTypes))); 
      var introduceDataMemberAspect = 
       new CustomAttributeIntroductionAspect(
        new ObjectConstruction(typeof(DataMemberAttribute).GetConstructor(Type.EmptyTypes))); 

      yield return new AspectInstance(targetType, introduceDataContractAspect); 

      foreach (var property in targetType.GetProperties(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance)) 
      { 
       if (property.CanWrite && !property.IsDefined(typeof(NotADataMemberAttribute), false)) 
       { 
        yield return new AspectInstance(property, introduceDataMemberAspect); 
       } 
      } 
     } 
    } 
} 

이제는 datamember 속성을 생성하십시오.

[AttributeUsage(AttributeTargets.Property)] 

    public sealed class NotADataMemberAttribute:Attribute 
    { 

    } 

[NotADataMember]를 사용하여 데이터 멤버가되고 싶지 않은 몇 가지 속성을 장식하십시오.

AssemblyInfo.cs 파일에 다음 줄을 추가하십시오. YourNameSpaces를 특정 프로젝트에 맞게 바꿉니다.

[assembly: DataContractAspect(AttributeTargetTypes = "YourNamespaces.DataContracts.*")] 

그 것이다.

이 방법을 사용하면 모든 구성원을 DataMember 특성으로 꾸밀 필요가 없습니다. 또한 DataContract를 사용하여 모든 클래스를 꾸밀 필요가 없습니다.