protected override void SetPropertyValue(object instance, PropertyInfo prop, object value)
{
object[] attributes = prop.GetCustomAttributes(typeof(WithAccessAttribute), false);
if (attributes.Length == 0)
{
base.SetPropertyValue(instance, prop, value);
return;
}
WithAccessAttribute accessAttribute = (WithAccessAttribute) attributes[0];
IPropertyAccessor propertyAccessor;
switch(accessAttribute.Access)
{
case PropertyAccess.Property:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("property");
break;
case PropertyAccess.Field:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("field");
break;
case PropertyAccess.FieldCamelcase:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("field.camelcase");
break;
case PropertyAccess.FieldCamelcaseUnderscore:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("field.camelcase-underscore");
break;
case PropertyAccess.FieldPascalcaseMUnderscore:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("field.pascalcase-m-underscore");
break;
case PropertyAccess.FieldLowercaseUnderscore:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("field.lowercase-underscore");
break;
case PropertyAccess.NosetterCamelcase:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("nosetter.camelcase");
break;
case PropertyAccess.NosetterCamelcaseUnderscore:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("nosetter.camelcase-underscore");
break;
case PropertyAccess.NosetterPascalcaseMUndersc:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("nosetter.pascalcase-m-underscore");
break;
case PropertyAccess.NosetterLowercaseUnderscore:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("nosetter.lowercase-underscore");
break;
case PropertyAccess.NosetterLowercase:
propertyAccessor = PropertyAccessorFactory.GetPropertyAccessor("nosetter.lowercase");
break;
default:
throw new ArgumentOutOfRangeException();
}
propertyAccessor.GetSetter(instance.GetType(), prop.Name).Set(instance, value);
}