首页 文章

有没有办法在WCF的数据协定中使用DataMember修饰多个属性?

提问于
浏览
0

我有一个基本的WCF服务 . 我已经拆分了我的数据 Contract ,其中一个是具有大量公共属性的类 . 如果我想让客户端可以使用这些属性,我假设所有这些都需要[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; }

2 回答

  • 1

    不,遗憾的是,无法使用该属性标记属性组 .

  • 0

    是 . 您可以使用面向方面编程技术 . 使用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来装饰每个类 .

相关问题