是否可以从方法符号中获取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?鉴于这甚至可能,重载方法呢?
答案 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;
这将为您提供编译时的安全性。虽然表现不佳。