Как получить MethodInfo функции класса, без сравнения строк

Как и в предыдущем моем вопросе, когда я спрашивал о получении FieldInfo поля, Как получить FieldInfo поля из значения, из ответов там я скомпилировал этот вспомогательный класс,

using System;
using System.Reflection;
using System.Linq.Expressions;

internal class Program
{
    class MyClass
    {
#pragma warning disable 0414, 0612, 0618, 0649
        private int myInt = 24;
#pragma warning restore 0414, 0612, 0618, 0649

        public const BindingFlags _flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;

        public MyClass()
        {
            MemberInfo myIntMI = GetMemberInfo(this, c => c.myInt);
            Console.WriteLine(myIntMI.Name + ": " + GetFieldValue(myIntMI) + ", " + GetFieldInfo(myIntMI).FieldType);

//          MemberInfo tfMI = GetMemberInfo(this, cw => cw.testFunction());
//          MemberInfo tfMI = GetMemberInfo(this, cw => cw.testFunction);
//          Console.WriteLine(tfMI.Name + ": " + GetFieldValue(tfMI) + ", " + GetFieldInfo(tfMI).FieldType);

            foreach( var mi in GetType().GetMethods(_flags) )
            {
                Console.WriteLine("method: " + mi);
            }
        }

        private void testFunction() { }

        private object GetFieldValue(MemberInfo mi)
        {
            return GetFieldInfo(mi).GetValue(this);
        }

        private FieldInfo GetFieldInfo(MemberInfo mi)
        {
            return GetType().GetField(mi.Name, _flags);
        }

        private MemberInfo GetMemberInfo<TModel, TItem>(TModel model, Expression<Func<TModel, TItem>> expr)
        {
            return ( (MemberExpression)expr.Body ).Member;
        }
    }
}

Который работает очень хорошо, используя GetMemberInfo(this, c => c.myInt, но закомментированная строка - это то, что я сейчас запутался, GetMemberInfo(this, c => c.testFunction) или же GetMemberInfo(this, c => c.testFunction()),

Есть ли способ, без сравнения строк, я могу получить информацию об участнике, которая доступна из GetMethods() или GetMethod("testFunction")?

1 ответ

Решение

MemberExpression только для свойств и полей. Вы, наверное, смотрите на MethodCallExpression,

Так что-то вроде

((MethodCallExpression)expr.Body).Method

при условии, что вы передаете лямбда, которая выглядит как () => this.testFunction()

Таким образом, чтобы получить MemberInfo вы бы получили Method свойство MemberCallExpression,

Кроме того, вы должны затем изменить GetMemberInfo сигнатура метода, потому что это лямбда, которая не принимает параметров и возвращает тот же тип, который возвращает ваш метод, так что это будет private MemberInfo GetMemberInfo<T>(Expression<Func<T, void>> expr) или что-то близкое к этому.

Я не уверен на 100%, но что происходит, this.testFunction на самом деле синтаксический сахар для создания делегата, так что это на самом деле что-то вроде new Action(this.testFunction) при условии, testFunction является void testFunction(), Или как то так, потому что this.testFunction это не членский доступ, а создание делегата.

Другие вопросы по тегам