Как получить нестатический MethodInfo, используя имя метода (не в строке, не ища в типе класса)

1

Рассмотрим следующий код:

public class Test
{
    [System.AttributeUsage(System.AttributeTargets.Method)]
    class MethodAttribute : System.Attribute
    {
        public MethodAttribute(System.Reflection.MethodInfo methodInfo)
        {

        }
    }

    public void Foo()
    {

    }

    [Method(Test.Foo)] //< THIS IS THE IMPORTANT LINE
    public void Boo()
    {

    }
}

Я хочу сохранить экземпляр MethodInfo Foo в атрибуте Boo, но проблема в том, что я не могу использовать Foo и Test.Foo для получения экземпляра MethodInfo. Я не могу использовать typeof(Test).GetMethod("Foo") (не мое решение).

Важная информация:

Абсолютно неважная информация:

  • Почему я не могу использовать typeof(Test).GetMethod("Foo"): мне не разрешено. Это не в моих силах изменить это решение. Я не могу. (Кроме того, лично я хотел бы избежать этого, так как ему нужно сделать некоторый поиск вместо того, чтобы статически ставить данные. Также он не будет изменен автоматически во время рефакторинга и будет проверять время выполнения, а не время компиляции.)
  • Почему я хочу это сделать: позже в коде я хочу создать делегат из Boo() (обычно это нормально, с экземпляром) и использовать в специальной четной системе или что-то в этом роде. Прежде чем он вызывается, этот атрибут позволяет настроить метод для вызова в процессе подготовки к главному событию (необязательно, он может быть нулевым), и я знаю, как создать делегат, когда у меня есть объект и информация о методе.
  • Почему я не могу просто предоставить обоих делегатов при регистрации или что-то еще: потому что класс, содержащий эти методы, не всегда тот, кто регистрируется в источнике событий, мне нужно как можно проще сохранить регистрационный код. Другими словами, я хочу избежать ситуации, когда человек пишут метод, ответственный за подключение блогов, чтобы добавить этого делегата.
  • 0
    Я не уверен, но я думаю, что атрибуты могут содержать только значения констант компиляции, поэтому использование отражения внутри не будет компилироваться в любом случае.
  • 0
    Разве указатель на метод не является константой? Я имею в виду, что это не Python, вы не можете изменить указатель на метод в классе. Только если он виртуальный, но мне нужен конкретный метод Test.Foo MethodInfo, и он должен быть неизменным все время, я не прав? Я имею в виду, что вы не можете делать что-то вроде Test.Foo = Test.Boo или Test.Foo = () => ... ; ...
Показать ещё 6 комментариев
Теги:
unity3d
reflection
mono
system.reflection

1 ответ

0

выражение выражения:

static public class Metadata<T>
{
    static public PropertyInfo Property<TProperty>(Expression<Func<T, TProperty>> property)
    {
        var expression = property.Body as MemberExpression;
        return expression.Member as PropertyInfo;
    }
}

var foo = Metadata<Test>.Property(test => test.Foo);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню