C # переопределить атрибут в подклассе - PullRequest
18 голосов
/ 01 октября 2010
public class MyWebControl {

    [ExternallyVisible]
    public string StyleString {get;set;}

}

public class SmarterWebControl : MyWebControl {

    [ExternallyVisible]
    public string CssName{get;set;}

    new public string StyleString {get;set;} //Doesn't work

}

Можно ли удалить атрибут в подклассе?Я хочу, чтобы атрибут наследовался другими подклассами, но только не этим.

Редактировать: Ой, похоже, я забыл скомпилировать или что-то в этом роде, потому что код, опубликованный выше, действительно работает!

Ответы [ 4 ]

17 голосов
/ 01 октября 2010

Именно поэтому атрибуты платформы, которые можно «переопределить», принимают логический параметр, который (на первый взгляд) кажется бессмысленным.Возьмите BrowsableAttribute например;Судя по названию, логический параметр может показаться устаревшим, но возьмем следующий пример:

class SomeComponent
{
  [Browsable(true)]
  public virtual string SomeInfo{get;set;}
}

class SomeOtherComponent : SomeComponent
{
  [Browsable(false)]  // this property should not be browsable any more
  public override string SomeInfo{get;set;}
}

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

5 голосов
/ 01 октября 2010

У меня работает.

Тестовый код:

public static void Main()
{
    var attribute = GetAttribute(typeof (MyWebControl), "StyleString", false);
    Debug.Assert(attribute != null);

    attribute = GetAttribute(typeof(SmarterWebControl), "StyleString", false);
    Debug.Assert(attribute == null);

    attribute = GetAttribute(typeof(SmarterWebControl), "StyleString", true);
    Debug.Assert(attribute == null);
}

private static ExternallyVisibleAttribute GetAttribute(Type type, string propertyName, bool inherit)
{
    PropertyInfo property = type.GetProperties().Where(p=>p.Name.Equals(propertyName, StringComparison.OrdinalIgnoreCase)).FirstOrDefault();

    var list = property.GetCustomAttributes(typeof(ExternallyVisibleAttribute), inherit).Select(o => (ExternallyVisibleAttribute)o);

    return list.FirstOrDefault();
}
4 голосов
/ 01 октября 2010

Я не понимаю, в чем проблема. Размещенный код выполняет ожидаемую вещь (по крайней мере, то, что, по-видимому, вы ожидаете) в моем тесте: свойство StyleString не имеет атрибута ExternallyVisible Вот мой тестовый код:

[AttributeUsage(AttributeTargets.Property)]
public class ExternallyVisible : Attribute
{
}

public class MyWebControl
{
    [ExternallyVisible]
    public string StyleString { get; set; }
}

public class SmarterWebControl : MyWebControl
{
    [ExternallyVisible]
    public string CssName { get; set; }

    new public string StyleString { get; set; } // Doesn't work
}

class Program
{
    static void Main()
    {
        MyWebControl myctrl = new MyWebControl();
        SmarterWebControl smartctrl = new SmarterWebControl();

        MemberInfo info = typeof(SmarterWebControl);
        PropertyInfo[] props = (typeof(SmarterWebControl)).GetProperties();
        Console.WriteLine("{0} properties", props.Length);

        foreach (var prop in props)
        {
            Console.WriteLine(prop.Name);
            foreach (var attr in prop.GetCustomAttributes(true))
            {
                Console.WriteLine("  " + attr);
            }
        }

        Console.ReadLine();
    }
}

В .NET 4.0 я получаю этот вывод:

2 properties
CssName
  sotesto.ExternallyVisible
StyleString

Другими словами, атрибут не применяется к свойству StyleString.

2 голосов
/ 01 октября 2010

Вы можете унаследовать атрибут и добавить свойство, которое управляет срабатыванием кода attrbiute или нет.

тогда вы можете переопределить поведение атрибутов унаследованного класса?

так что вы бы использовали (если вы добавили параметр в конструктор)

[ExternallyVisible(false)]

[ExternallyVisible(Enabled = false)]

я использовал свойство enable в классе atrtibute

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