Is there a way to decorate multiple properties with DataMember in a data contract in WCF?
我有一个基本的WCF服务。我已经拆分了我的数据契约,其中一个是具有大量公共属性的类。如果我想让客户机可以使用这些属性,我假设所有这些属性都需要[datamember]。因此,由于这些属性的数量很多,有没有任何方法可以用[datamember]对它们进行大容量的装饰?类似:
1 2 3 4 5 6 7 8 | [DataMember] ( public string Title { get; set; } public Guid ID { get; set; } public Description { get; set; } //more properties... ) |
我只见过:
1 2 3 4 5 6 | [DataMember] public string Title { get; set; } [DataMember] public Guid ID { get; set; } [DataMember] public Description { get; set; } |
对。您可以为此使用面向方面的编程技术。下面是使用PostSharp时的解决方案。PostSharp可以通过nuget安装(PostSharp Express是免费的)。
你需要先写一个方面。请参见下面的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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属性。
1 2 3 4 5 6 | [AttributeUsage(AttributeTargets.Property)] public sealed class NotADataMemberAttribute:Attribute { } |
用[NotadataMember]修饰那些您不想成为数据成员的属性。
在assemblyinfo.cs文件中添加以下行。将您的命名空间替换为适合您的特定项目的命名空间。
1 | [assembly: DataContractAspect(AttributeTargetTypes ="YourNamespaces.DataContracts.*")] |
就是这样。
使用这种方法,您不必用datamember属性修饰每个成员。此外,您不必用DataContract来装饰每个类。
不,很遗憾,不能用属性标记属性组。