我想将MethodBase强制转换为RuntimeMethodInfo,以便检索反射方法的参数的名称和类型,以及这些方法的返回类型。
我可以在Inmediate Window中进行直接演员,但是没有找到用F#进行演员表演的方法。
答案 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