2014-11-13 4 views
0

У меня есть базовый сервис WCF. Я разделил свои контракты с данными, и один из них - класс с большим количеством публичных свойств. Если я хочу, чтобы эти свойства были доступны клиенту, я предполагаю, что все из них должны иметь [DataMember]. Итак, поскольку существует большое количество этих свойств, есть ли какой-либо способ их декорирования с помощью [DataMember]? что-то вроде:Есть ли способ украсить несколько свойств DataMember в контракте данных в WCF?

[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; } 

ответ

0

Нет, к сожалению, это не возможно, чтобы отметить группу свойств с атрибутом.

+0

Спасибо за ответ. На чем вы основываетесь? По общему признанию, после небольшого исследования я пришел к такому же выводу, но я еще не заметил, что это невозможно сделать. – sr28

+0

Если у вас есть Resharper, вы можете создать маленькие шаблоны, которые помогут процессу. Тогда всегда есть режим редактирования столбцов, где вы можете вставить его для кучи свойств. Это поможет некоторым. – Cameron

+0

Если вы используете 3.5SP1 +, нет необходимости приписывать что-либо - все публичные члены будут сериализованы по типам, которые иначе не могут быть сериализованы и не отмечены DataContract/DataMember –

1

Да. Для этого вы можете использовать технологию Aspect Oriented Programming. Вот решение, когда вы используете PostSharp. PostSharp может быть установлен через nuget (postharp 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 
    { 

    } 

Украсьте те немногие свойства, которые вы не хотите быть DataMembers с [NotADataMember].

Добавьте следующую строку в файл AssemblyInfo.cs. Замените YourNameSpaces соответствующим вашему проекту.

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

Thats it.

При таком подходе вам не нужно украшать каждый элемент атрибутом DataMember. Кроме того, вам не нужно украшать каждый класс DataContract.

 Смежные вопросы

  • Нет связанных вопросов^_^