有没有办法在 WCF 的数据合同中使用 DataMember 装饰多个属性?

Posted

技术标签:

【中文标题】有没有办法在 WCF 的数据合同中使用 DataMember 装饰多个属性?【英文标题】:Is there a way to decorate multiple properties with DataMember in a data contract in WCF? 【发布时间】:2015-01-10 20:13:40 【问题描述】:

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

【问题讨论】:

【参考方案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] 装饰那些您不想成为 DataMember 的属性。

在 AssemblyInfo.cs 文件中添加以下行。将 YourNameSpaces 替换为适合您项目的具体内容。

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

就是这样。

使用这种方法,您不必用 DataMember 属性装饰每个成员。此外,您不必使用 DataContract 装饰每个类。

【讨论】:

【参考方案2】:

不,很遗憾,无法使用属性标记属性组。

【讨论】:

感谢您的回复。你的依据是什么?诚然,经过一些研究,我得出了相同的结论,但我还没有看到它说这不能做到。 如果你有 Resharper,你可以创建一些小模板来帮助这个过程。然后总是有列编辑模式,您可以在其中为一堆属性插入它。这些会有所帮助。 如果您使用的是 3.5SP1+,则无需指定任何属性 - 所有公共成员都将在不可序列化且未标记为 DataContract/DataMember 的类型上进行序列化 虽然您有权认为您确实失去了很多功能,但这里列出了一些功能:***.com/questions/4836683/…

以上是关于有没有办法在 WCF 的数据合同中使用 DataMember 装饰多个属性?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 数据合同

数据合同和数据成员

数据合同和数据成员

WCF - 使用完全相同的数据合同的多个服务合同

WCF 服务合同不匹配

WCF 暂停调用