在F#中将MethodBase转换为RuntimeMethodInfo

时间:2014-08-20 21:27:51

标签: reflection f#

我想将MethodBase强制转换为RuntimeMethodInfo,以便检索反射方法的参数的名称和类型,以及这些方法的返回类型。

我可以在Inmediate Window中进行直接演员,但是没有找到用F#进行演员表演的方法。

1 个答案:

答案 0 :(得分:3)

为什么演员?您可以在MethodBase参考上调用GetParameters()和您需要的所有其他成员。

let methodInfo : MethodBase = //whatever
let firstParamName = methodInfo.GetParameters().[0].Name

编辑(返回类型):

首先,请注意GetMethod返回MethodInfo,而不是MethodBase。您无法转换为RuntimeMethodInfo,因为正如其他人所说,这是一种内部类型。但ReturnType属性是在MethodInfo上声明的,所以一切都很好。

因此,这是有效的,methodInfo的静态类型是MethodInfo:

let methodInfo = typeof<object>.GetMethod("ToString")
let returnTypeName = methodInfo.ReturnType.Name // "String"

其次,如果您对MethodBase有一个静态引用,您知道它是一个MethodInfo,请使用:?>运算符。例如:

let toMethodInfo (mb : MethodBase) = mb :?> MethodInfo

另一方面,如果您不确定对象的实际类型,可以使用match

let tryToMethodInfo (mb : MethodBase) =
    match mb with
    | :? MethodInfo as result -> Some result
    | _ -> None

最后,因为你问的是#34;反过来&#34;在您的评论中:当您从派生类转到其基类之一(总是成功)时,您不需要问号:

let toMethodBase (mi : MethodInfo) = mi :> MethodBase