有没有一种方法可以在WCF中的数据契约中使用DataMember装饰多个属性

本文关键字:契约 数据 DataMember 属性 有没有 一种 方法 WCF | 更新日期: 2023-09-27 18:30:13

我有一个基本的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; }

有没有一种方法可以在WCF中的数据契约中使用DataMember装饰多个属性

是。您可以使用面向方面编程技术来实现这一点。以下是使用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来装饰每个类。

不,不幸的是,不可能用属性标记属性组。