Извините, вы не можете получить доступ к экземпляру класса или информации о свойствах внутри вашего атрибута.
Вы должны написать дополнительный метод, например, статический метод в некотором «статическом» классе, который позволит вам делать то, что вы хотите.
Пример ....
public static string FormatProperty(object instance, PropertyInfo property)
{
CustomStringFormatAttribute attrib = Attribute.GetCustomAttribute(property, typeof(CustomStringFormatAttribute)) as CustomStringFormatAttribute;
return property.GetValue(instance, null).ToString().PadLeft(attrib.MaxLength, ' ');
}
public static string FormatProperty(object instance, string propertyName)
{
return FormatProperty(instance, instance.GetType().GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance));
}
Но это очень неудобно и безумно медленно, поскольку использует отражение для получения значения свойства через информацию о свойстве.
Для доступа к атрибутам свойств вам необходим PropertyInfo.
public static int GetPropertyMaxLength(PropertyInfo property)
{
CustomStringFormatAttribute attrib = Attribute.GetCustomAttribute(property, typeof(CustomStringFormatAttribute)) as CustomStringFormatAttribute;
return attrib != null ? attrib.MaxLength : int.MaxValue;
}
public static int GetPropertyMaxLength(Type type, string propertyName)
{
return GetPropertyMaxLength(type.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance));
}
Предположим, мы поместили эти функции внутри атрибута.
Затем мы хотим переопределить, например, наш метод ToString в нашем классе Customer.
public override string ToString()
{
return CustomStringFormatAttribute.FormatProperty(this, "Name");
}
Проблема в этом, конечно, в скорости, она использует отражение по имени, очень медленно, и рефакторинг, у вас не будет предупреждения или ошибки времени компиляции, если свойство "Имя" не существует, вы получите только исключение во время выполнения. Я бы предложил вам использовать другой механизм.
В более новой версии языка вы можете использовать лямбда-выражения для получения информации о свойстве непосредственно самим свойством, но, поскольку вы находитесь в C # 2.0, это невозможно.
Другое решение может быть следующим: добавить вместо этого другое свойство с именем FormattedXXX, например, FormattedName, которое возвращает длину по вашему желанию, и вы можете использовать это свойство вместо свойства Name.
Это позволит вам сохранить отформатированную версию свойства рядом с вашей собственностью.