与我的上一个问题类似,当我询问从那里的答案中获取字段How to get the FieldInfo of a field from the value的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")获取成员信息?

最佳答案

MemberExpression仅适用于属性和字段。您可能会看MethodCallExpression

所以像

((MethodCallExpression)expr.Body).Method


假设您传递的Lambda看起来像() => this.testFunction()

因此,要获取MemberInfo,您将获得MethodMemberCallExpression属性。

另外,您还应该更改GetMemberInfo方法签名,因为这是一个不带参数的lambda,并且返回的方法与您的方法返回的类型相同,因此它将是private MemberInfo GetMemberInfo<T>(Expression<Func<T, void>> expr)或与其相似的东西。

我不确定100%,但是会发生什么事,this.testFunction实际上是用于创建委托的语法糖,所以实际上它类似于new Action(this.testFunction),假设testFunctionvoid testFunction()。或类似这样的内容,因为this.testFunction不是成员访问权,而是委托创建。

关于c# - 如何在不进行字符串比较的情况下获取类函数的MethodInfo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28986530/

10-10 19:55