(.net) Как проверить, определена ли данная переменная с атрибутом - PullRequest
1 голос
/ 17 июля 2009

Я хотел бы знать, имеет ли моя переменная textBox1 значение ABCAttribute. Как я могу это проверить?

Ответы [ 3 ]

6 голосов
/ 17 июля 2009

Вам нужен дескриптор класса (типа), в котором существует textBox1:

Type myClassType = typeof(MyClass);

MemberInfo[] members = myClassType.GetMember("textBox1",
        BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

if(members.Length > 0) //found a member called "textBox1"
{
    object[] attribs = members[0].GetCustomAttributes(typeof(ABCAttribute));

    if(attribs.Length > 0) //found an attribute of type ABCAttribute
    {
        ABCAttribute myAttrib = attribs[0] as ABCAttribute;
        //we know "textBox1" has an ABCAttribute,
        //and we have a handle to the attribute!
    }
}

Это немного неприятно, одна из возможностей - свернуть его в метод расширения, используемый следующим образом:

MyObject obj = new MyObject();
bool hasIt = obj.HasAttribute("textBox1", typeof(ABCAttribute));

public static bool HasAttribute(this object item, string memberName, Type attribute)
{
    MemberInfo[] members = item.GetType().GetMember(memberName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    if(members.Length > 0)
    {
        object[] attribs = members[0].GetCustomAttributes(attribute);
        if(attribs.length > 0)
        {
            return true;
        }
    }
    return false;
}
2 голосов
/ 17 июля 2009

Если предположить, что textBox1 - это элемент управления TextBox, то ответ, скорее всего, «Нет, у него нет атрибута». Атрибуты присваиваются Типу , а не экземпляру типа. Вы можете посмотреть, какие атрибуты есть в любом TextBox, который когда-либо был, есть или будет создан прямо сейчас (для конкретной версии фреймворка).

0 голосов
/ 17 июля 2009

Вы имеете в виду атрибуты, как в:

<input class="textbox" type="text" value="search" ABC="val" name="q"/> 

В этом случае вы можете найти имя атрибута в коллекции атрибутов элемента управления.

Коллекция атрибутов элемента управления WebForm

Если вы имеете в виду атрибуты, как в:

<ValidationPropertyAttribute("Text")> _
<ControlValuePropertyAttribute("Text")> _
Public Class TextBox _ 
...

тогда, как упоминали другие авторы, вам придется использовать Reflection, чтобы определить, имеет ли элемент управления определенный атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...