有没有办法在 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 装饰多个属性?的主要内容,如果未能解决你的问题,请参考以下文章