2014-09-24 3 views
2

Fsi에서 F # 어셈블리를 소비하려고하지만 모듈에 정의 된 메서드 목록을 가져올 방법을 찾지 못해 전화 할 수 있습니다.모듈에 정의 된 메소드를 얻으려면 어떻게해야합니까?

다음은이 작업을 수행하려고하는 샘플 파일입니다. "exposing methods that are cross language friendly"을 따라, 필자는 파일의 맨 위에 네임 스페이스를 추가하고 이전에 있던 레터 바인딩 메서드를 포함하는 모듈을 추가했습니다. 가능하다면 모든 것을 정적 클래스로 옮기는 것을 피하고 싶습니다.

리플렉션을 사용하거나 사용 가능한 방법과 적절한 방법의 대소 문자를 찾는 데 도움이되는 다른 방법으로 모듈을 작성할 수 있습니까?

1) 원하는 어셈블리를 가져 오기 : 나는 문제를 정확하게 이해하는 경우 다음과 같이

답변

2

, 내가 진행한다. 예를 들어, 현재 실행되고있는 조립체가 그 다음 I GetTypes를 호출하여 얻은 조립체에 정의 된 모든 형태를 취할 것이다

System.Reflection.Assembly.GetExecutingAssembly 

2)에 의해 얻어 질 수있다. 모듈을 걸러 내고 싶다면 다음과 같이 쓸 수있다.

let modules = Array.filter (fun x -> FSharpType.IsModule x) (assembly.GetTypes()) 

FSharpType 클래스에 대한 문서는 here를 찾을 수 있습니다. 이 이름은 Microsoft.FSharp.Reflection 네임 스페이스에 포함되어 있습니다.

3) 단일 모듈에서 GetMethods 메서드를 호출하여 모듈의 메서드를 가져올 수 있습니다.

let methods = [| for t in modules do for m in t.GetMethods() -> m |] 
for m in methods do 
    printfn "%A" m 

methodsMethodInfo 요소를 포함하는 배열입니다 : 예를 들어, 그들 모두를 인쇄하려면, 당신은 뭔가를 작성할 수 있습니다. GetMethods은 일부 메소드를 필터링 할 수있는 BindingFlags 유형의 선택적 매개 변수를 취합니다. documentation을 살펴보십시오.

MethodInfo 개체에서 Invoke 메서드를 호출하여 작업을 호출 할 수도 있습니다.

희망이 유용했습니다.

관련 문제