private void InitializeProperties()
{
this.Properties = new List<PropertyInfo>();
this.PropertyMembers = new List<DataMemberAttribute>();
var properties = this.hasCustomContract ?
this.type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) :
this.type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
var tuples = from p in properties
let attr = p.GetCustomAttributes(false)
let member = attr.OfType<DataMemberAttribute>().FirstOrDefault()
where p.CanRead && p.CanWrite && attr.OfType<IgnoreDataMemberAttribute>().Count() == 0
select new
{
Info = p,
Member = member
};
foreach (var tuple in tuples.Where(t => !this.hasCustomContract || t.Member != null))
{
DataMemberAttribute member = tuple.Member != null ?
tuple.Member :
new DataMemberAttribute()
{
EmitDefaultValue = true,
IsRequired = false
};
member.Name = !string.IsNullOrEmpty(member.Name) ? member.Name : tuple.Info.Name;
this.PropertyMembers.Add(member);
this.Properties.Add(tuple.Info);
}
}