예. 이를 위해 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를 사용하여 모든 클래스를 꾸밀 필요가 없습니다.
답장을 보내 주셔서 감사합니다. 그걸 기반으로 무엇을합니까? 약간의 연구가 끝난 후에도 같은 결론에 도달 했음에도 불구하고 아직 완료되지 않았다는 것을 알지 못했습니다. – sr28
Resharper를 사용하는 경우 프로세스를 돕는 템플릿을 거의 만들 수 없습니다. 그런 다음 여러 속성에 대해 열 삽입 모드를 사용할 수있는 열 편집 모드가 항상 있습니다. 이것들은 도움이 될 것입니다. – Cameron
3.5SP1 +를 사용하는 경우 아무 것도 지정할 필요가 없습니다. 모든 public 멤버는 serialize되지 않고 DataContract/DataMember로 표시되지 않는 유형으로 serialize됩니다. –