2013-09-27 2 views
0

Я ищу способ получить собственный атрибут внутри свойства.Получение собственных атрибутов/отражение?

Позвольте мне показать, что я ищу

Я хочу использовать свойство для поплавков/двойных значений, чтобы дать tolerence для Comparision.

например.

[FieldAttribute(CompareTolerance = 0.001)] 
public float SomeProperty 
{ 
    get { return this.someProperty; } 
    set 
    { 
     if (Math.Abs(someProperty- value) > 0.001) // here i would like to use somthing like '> FieldAttribute.CompareTolerance' 
     this.someProperty = value; 
    } 
} 

Из другого класса я хотел бы использовать

PropertyInfo propertyInfo = someobject.GetType().GetProperty("SomeProperty"); 
if (null != propertyInfo) 
{ 
    Attribute attribute = Attribute.GetCustomAttribute(propertyInfo, typeof (FieldAttribute)); 
    FieldAttribute fieldAttribute = attribue as FieldAttribute; 
    return fieldAttribute.CompareTolerance; 
} 


... 

Таким образом, в конце концов, мне нужно было только

if(Math.Abs(someProperty - value) < someobject.CompareTolerance("SomeField")) ... values are equal 

Но есть способ, чтобы получить atribute в пределах собственности без использования отражения каждый раз (это.CompareTolerance («SomeField»))

+1

Не совсем. Атрибут, который у вас есть для кода экспликации в этом свойстве, кажется мне глупым. Вместо того, чтобы записывать константу в атрибут, записывайте ее в код, который вы должны писать в любом случае. Если вам нравится это через атрибут, вы можете пойти по дороге AOP и использовать что-то вроде Postsharp. Там вы можете создать атрибут, который будет вводить правильный код в compiletime, чтобы отражение не было необходимым. И если сделано правильно, специальное кодирование в свойстве также не понадобится. – Ralf

+0

Я бы не только хотел использовать его в атрибуте, но и в других классах, которые могут сравниться с этим свойством. Он предназначен только для определения чего-то вроде допущения ONCE для значения и использования допуска в разных местах (например, для сравнения чего-либо с этим свойством, но не для его установки). Использовать значение дважды кажется источником ошибок для меня. Вы никогда не узнаете или не заметите, изменит ли кто-либо атрибут, но не сеттер, или установщик, но не атрибут. Если вы создаете второй класс со всеми допусками как static/const, обзор отсутствует. – Offler

+0

Тогда я бы сказал, что возвращаемый тип этого свойства больше не плавает. Его новый тип, который представляет собой поплавок, его толерантность и правильные методы сравнения. – Ralf

ответ

1

Нет другого пути вокруг отражения f или это, за исключением, может быть, генерации кода. Вы можете рассмотреть T4 template, который генерирует определение вашего класса partial с нужным кодом getter/setter (возможно, его необходимо разместить частично), после извлечения значений с отражением от атрибута. Затем снова скомпилируйте.

Я не уверен, почему все, кажется, избегают генерации кода в последнее время. T4 доставляет удовольствие в современных версиях VS.

+0

Проблемы с генерацией: некоторые/многие (в соответствии с на которые задан пик) свойствам нужна специальная обработка (например, проверка на специальную дату), поэтому кажется, что автогенерирующие классы либо уничтожат там добавленные вещи. Я не думаю, что есть что-то вроде «частичного setter свойства» (думая о случае обновления, если proeprty изменен. – Offler

+0

, который является целью частичных классов. Вы помещаете сгенерированный код в отдельный файл и руку написанную часть в другом файле, проверьте «частичные классы» и «частичные методы». Я отредактирую свой ответ с помощью некоторых ссылок. –

+0

Если вы сгенерируете код, а затем необходимо применить что-то особенное к одному свойству, в следующий раз при создании вы будете (например, вы добавляете к одному свойству также границы (или здесь разные значения для сравнения) или специальное изменение формата, чтобы соответствовать данным в схеме базы данных или ...). Что касается частичных методов: если у вас есть Свойство, имеют: а) метод, который возвращает что-то еще тогда пустое - это запрещено для частичных методов. б) метод, который не является частным - запрещен для частичных методов. Оба не позволили бы частичным методам. поэтому я не думаю, что частичные свойства существуют в C#. – Offler

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