我有一个基本的WCF服务。我已经拆分了我的数据合同,其中一个是拥有大量公共财产的类。如果我想向客户提供这些属性,我假设所有这些都需要[DataMember]。那么,由于有大量这些属性,有没有办法用[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 :(得分:1)
是。您可以使用面向方面编程技术。使用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);
}
}
}
}
}
现在创建一个Not a datamember属性。
[AttributeUsage(AttributeTargets.Property)]
public sealed class NotADataMemberAttribute:Attribute
{
}
使用[NotADataMember]装饰您不希望成为DataMembers的少数属性。
在AssemblyInfo.cs文件中添加以下行。将YourNameSpaces替换为适合您的项目特定。
[assembly: DataContractAspect(AttributeTargetTypes = "YourNamespaces.DataContracts.*")]
多数民众赞成。
使用这种方法,您不必使用DataMember属性装饰每个成员。此外,您不必使用DataContract来装饰每个类。
答案 1 :(得分:0)
不,遗憾的是,无法使用属性标记属性组。