Да. Для этого вы можете использовать технологию 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.
Спасибо за ответ. На чем вы основываетесь? По общему признанию, после небольшого исследования я пришел к такому же выводу, но я еще не заметил, что это невозможно сделать. – sr28
Если у вас есть Resharper, вы можете создать маленькие шаблоны, которые помогут процессу. Тогда всегда есть режим редактирования столбцов, где вы можете вставить его для кучи свойств. Это поможет некоторым. – Cameron
Если вы используете 3.5SP1 +, нет необходимости приписывать что-либо - все публичные члены будут сериализованы по типам, которые иначе не могут быть сериализованы и не отмечены DataContract/DataMember –