如何从方法符号中获取MethodInfo

时间:2012-02-27 17:45:31

标签: c# .net reflection

是否可以从方法符号中获取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?鉴于这甚至可能,重载方法呢?

2 个答案:

答案 0 :(得分:8)

代表在Method property中包含您想要的MethodInfo。所以你的帮助方法可以简单:

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

您无法直接从方法组转换为Delegate。但你可以使用演员阵容。 E.g:

GetMethodInfo((Action)Console.WriteLine)

请注意,如果您尝试将其与usr的解决方案混合使用,则无法使用此功能。例如

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

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

答案 1 :(得分:2)

这在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;

这将为您提供编译时的安全性。虽然表现不佳。