Атрибуты в интерфейсе

Изменение вашего True <- return $ (l - 1 <= n) на True <- return $ (l <= n), чтобы соответствовать тому, что делает первый фрагмент, уравнивает время двух для меня (без изменения ответа).

Без этого изменения ваш второй фрагмент кода тратит впустую много времени, пытаясь найти убывающие последовательности длины l среди чисел [1..l-1] (для многих различных значений l), обреченная задача.

18
задан Thad 30 October 2008 в 21:14
поделиться

3 ответа

methodBase будет методом на классе, не интерфейсом. Необходимо будет искать тот же метод в интерфейсе. В C# это немного более просто (так как он должен быть подобно назван), но необходимо было бы рассмотреть вещи как явная реализация. Если у Вас будет код VB, то это будет более хитро, так как метод VB "Нечто" может реализовать метод интерфейса "Панель". Чтобы сделать это, необходимо было бы исследовать интерфейсную карту:

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Reflection;
interface IFoo
{
    void AAA(); // just to push Bar to index 1
    [Description("abc")]
    void Bar();
}
class Foo : IFoo
{
    public void AAA() { } // just to satisfy interface
    static void Main()
    {
        IFoo foo = new Foo();
        foo.Bar();
    }
    void IFoo.Bar()
    {
        GetAttribute();
    }

    void GetAttribute()
    { // simplified just to obtain the [Description]

        StackTrace stackTrace = new StackTrace();
        StackFrame stackFrame = stackTrace.GetFrame(1);
        MethodBase classMethod = stackFrame.GetMethod();
        InterfaceMapping map = GetType().GetInterfaceMap(typeof(IFoo));
        int index = Array.IndexOf(map.TargetMethods, classMethod);
        MethodBase iMethod = map.InterfaceMethods[index];
        string desc = ((DescriptionAttribute)Attribute.GetCustomAttribute(iMethod, typeof(DescriptionAttribute))).Description;
    }
}
7
ответ дан 30 November 2019 в 09:35
поделиться

Метод Mark's будет работать на неуниверсальные интерфейсы. Но кажется, что я имею дело с некоторыми, которые имеют дженерики

interface IFoo<T> {}
class Foo<T>: IFoo<T>
{
  T Bar()
}

, кажется, что T заменяется фактическим типом класса в карте. TargetMethods.

2
ответ дан 30 November 2019 в 09:35
поделиться

В то время как я сначала признаюсь, что никогда не пытался присоединить атрибуты к Интерфейсам, но что-то хотело бы следующую работу за Вас?

public abstract class SomeBaseClass: ISomeInterface
{
     [MyAttribute]
     abstract void MyTestMethod();


}

public SomeClass : SomeBaseClass{

  MyAttribute GetAttribute(){
      Type t = GetType();
      object[] attibutes = t.GetCustomAttributes(typeof(MyAttribute), false);

      if (attributes.Count() == 0)
            throw new Exception("could not find MyAttribute defined for " + methodBase.Name);
        return attributes[0] as MyAttribute;
  }


  ....
}
0
ответ дан 30 November 2019 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: