关于c#:有没有办法在WCF的数据协定中用DataMember修饰多个属性?

Is there a way to decorate multiple properties with DataMember in a data contract in WCF?

我有一个基本的WCF服务。我已经拆分了我的数据契约,其中一个是具有大量公共属性的类。如果我想让客户机可以使用这些属性,我假设所有这些属性都需要[datamember]。因此,由于这些属性的数量很多,有没有任何方法可以用[datamember]对它们进行大容量的装饰?类似:

1
2
3
4
5
6
7
8
[DataMember]
(
    public string Title { get; set; }
    public Guid ID { get; set; }
    public Description { get; set; }

    //more properties...
)

我只见过:

1
2
3
4
5
6
[DataMember]
public string Title { get; set; }
[DataMember]
public Guid ID { get; set; }
[DataMember]
public Description { get; set; }


对。您可以为此使用面向方面的编程技术。下面是使用PostSharp时的解决方案。PostSharp可以通过nuget安装(PostSharp Express是免费的)。

你需要先写一个方面。请参见下面的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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);
                }
            }
        }
    }
}

现在创建一个非datamember属性。

1
2
3
4
5
6
 [AttributeUsage(AttributeTargets.Property)]

    public sealed class NotADataMemberAttribute:Attribute
    {

    }

用[NotadataMember]修饰那些您不想成为数据成员的属性。

在assemblyinfo.cs文件中添加以下行。将您的命名空间替换为适合您的特定项目的命名空间。

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

就是这样。

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


不,很遗憾,不能用属性标记属性组。