如何从方法符号中获取MethodInfo

本文关键字:获取 MethodInfo 符号 方法 | 更新日期: 2023-09-27 18:25:53

是否可以从方法符号中获取MethodInfo对象?

因此,与相同

typeof(SomeClassSymbol) // this gets you a Type object

以下是我想做的:

public class Meatwad
{
    MethodInfo method;
    public Meatwad()
    {
        method = ReflectionThingy.GetMethodInfo(SomeMethod);
    }
    public void SomeMethod() { }
}

如何实现ReflectionThingy.GetMethodInfo?假设这是可能的,那么重载方法呢?

如何从方法符号中获取MethodInfo

委托在其Method属性中包含所需的MethodInfo。所以你的辅助方法可以很简单:

MethodInfo GetMethodInfo(Delegate d)
{
    return d.Method;
}

不能直接从方法组转换为Delegate。但你可以用石膏。例如:

GetMethodInfo((Action)Console.WriteLine)

请注意,如果您尝试将其与usr的解决方案混合使用,这将不起作用。例如

GetMethodInfo((Action)(() => Console.WriteLine()))

将返回生成的匿名方法的MethodInfo,而不是Console.WriteLine()

这在C#中是不可能的。但你可以自己构建:

    static MemberInfo MemberInfoCore(Expression body, ParameterExpression param)
    {
        if (body.NodeType == ExpressionType.MemberAccess)
        {
            var bodyMemberAccess = (MemberExpression)body;
            return bodyMemberAccess.Member;
        }
        else if (body.NodeType == ExpressionType.Call)
        {
            var bodyMemberAccess = (MethodCallExpression)body;
            return bodyMemberAccess.Method;
        }
        else throw new NotSupportedException();
    }
    public static MemberInfo MemberInfo<T1>(Expression<Func<T1>> memberSelectionExpression)
    {
        if (memberSelectionExpression == null) throw new ArgumentNullException("memberSelectionExpression");
        return MemberInfoCore(memberSelectionExpression.Body, null/*param*/);
    }

并像这样使用:

var methName = MemberInfo(() => SomeMethod()).MethodName;

这将为您提供编译时间安全性。不过表现不会很好。