Наследовать атрибутивную информацию класса в методе - PullRequest
1 голос
/ 26 марта 2012

У меня есть следующий атрибут:

class HandlerAttribute : System.Attribute
{
    public string MainName { get; private set; }
    public string SubName { get; private set; }

    public HandlerAttribute(string pValue, bool pIsMain) {
        if (pIsMain) MainName = pValue;
        else SubName = pValue;
    }
}

И вот как я использую атрибут

[Handler("SomeMainName", true)]
class Class1 {

    [Handler("SomeSubName", false)]
    void HandleThis() {
       Console.WriteLine("Hi");
    }
}

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

Я надеюсь, что кто-то может помочь мне с этим:)

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 26 марта 2012

Обновление: вы также можете использовать этот метод расширения.

public static class AttributeExtensions
{
    public static string GetMainName(this Class1 class1)
    {
        System.Attribute[] attrs = System.Attribute.GetCustomAttributes(class1.GetType());  // reflection

        foreach (System.Attribute attr in attrs)
        {
            if (attr is HandlerAttribute)
            {
                string mainName = (attr as HandlerAttribute).MainName;
                return mainName;
            }
        }
        throw new Exception("No MainName Attribute");
    }
}

Теперь после кодирования метода расширения вы можете использовать его для любого объекта типа Class1;

Class1 c1 = new Class1();
            string a =c1.GetMainName();

Или выможет использовать его напрямую.

 public class HandlerAttribute : System.Attribute
{
    public string MainName { get; private set; }
    public string SubName { get; private set; }

    public HandlerAttribute(string pValue, bool pIsMain)
    {
        if (pIsMain) MainName = pValue;
        else SubName = pValue;
    }
}

[Handler("SomeMainName", true)]
class Class1
{

    [Handler("SomeSubName", false)]
    public void HandleThis()
    {
        System.Attribute[] attrs = System.Attribute.GetCustomAttributes(this.GetType());  // reflection

        foreach (System.Attribute attr in attrs)
        {
            if (attr is HandlerAttribute)
            {
                string mainName = (attr as HandlerAttribute).MainName;

            }
        }
    }
}
0 голосов
/ 26 марта 2012

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

код

[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
sealed class HandlerAttribute : Attribute
{
    public string MainName { get; private set; }
    public string SubName { get; private set; }

    public HandlerAttribute(string pValue, bool pIsMain) {
        if (pIsMain) MainName = pValue;
        else SubName = pValue;
    }

    public HandlerAttributeData GetData(MemberInfo info)
    {
        if (info is Type)
        {
            return new HandlerAttributeData(MainName, null);
        }

        HandlerAttribute attribute = (HandlerAttribute)info.DeclaringType.GetCustomAttributes(typeof(HandlerAttribute), true)[0];

        return new HandlerAttributeData(attribute.MainName, SubName);
    }
}


class HandlerAttributeData
{
    public string MainName { get; private set; }
    public string SubName { get; private set; }

    public HandlerAttributeData(String mainName, String subName)
    {
        MainName = mainName;
        SubName = subName;
    }
}

Использование

        HandlerAttribute att = (HandlerAttribute)typeof(App).GetCustomAttributes(typeof(HandlerAttribute), true)[0];
        HandlerAttributeData data = att.GetData(typeof(App));

Вы можете использовать его с любым членом, и если вы напишите метод расширения, вы можете сделать его еще короче.

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