Изменение вашего True <- return $ (l - 1 <= n)
на True <- return $ (l <= n)
, чтобы соответствовать тому, что делает первый фрагмент, уравнивает время двух для меня (без изменения ответа).
Без этого изменения ваш второй фрагмент кода тратит впустую много времени, пытаясь найти убывающие последовательности длины l
среди чисел [1..l-1]
(для многих различных значений l
), обреченная задача.
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;
}
}
Метод Mark's будет работать на неуниверсальные интерфейсы. Но кажется, что я имею дело с некоторыми, которые имеют дженерики
interface IFoo<T> {}
class Foo<T>: IFoo<T>
{
T Bar()
}
, кажется, что T заменяется фактическим типом класса в карте. TargetMethods.
В то время как я сначала признаюсь, что никогда не пытался присоединить атрибуты к Интерфейсам, но что-то хотело бы следующую работу за Вас?
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;
}
....
}