2011-05-16 5 views
2

와 ByReferenceType에서 일반 매개 변수를 가져옵니다 내가 같은 매개 변수를 얻는 방법이 있습니다 매개 변수를 열거 할 세실를 사용Mono.Cecil

public void Foo(ref Action<string> bar); 

가 ByReferenceType을 산출합니다. 매개 변수가 전체 이름과 TypeReference을 반환 역 참조 시도에 GetElementType()를 호출 :

System.Action`1 

은 어떻게 든 일반 매개 변수를 잃은 있으며, 더 이상 GenericInstanceType이다.

byref 매개 변수를 제대로 역 참조하고 실제 일반 인스턴스 유형을 얻을 수 있습니까?

+0

제네릭 메소드를 나타내는 데 사용되는 표기법이 확실합니다 ... –

+0

예, 일반적인 매개 변수를 허용하는 일반적인 메소드입니다. 그러나 일반 매개 변수의 유형에 대한 정보는 제공하지 않습니다. – aethoric

+0

GenericInstanceType은 System.Action'1 과 같은 전체 이름을 생성하며 GenericParameters 멤버의 첫 번째 TypeReference 개체는 System.String의 멤버입니다. – aethoric

답변

2

(당신이 계신 알고있을 때 당신은 물론이 짧은 만들 수있다) 당신이 사용 TypeSpec에 뛰어 수 있습니다

ParameterDefinition parameter = ...; 
ByReferenceType byref = (ByReferenceType) parameter.ParameterType; 
GenericInstanceType action_string = (GenericInstanceType) byref.ElementType; 
TypeReference action = action_string.ElementType; 
TypeReference str = action_string.GenericArguments [0]; 

GetElementType 방법은 TypeSpec이있는 원래의 요소 유형을 반환 구성된.

+0

나는 행운과 비슷한 것을 시도했다. :(GenericInstanceType) (parameter.ParameterType.GetElementType()) => "parameter.ParameterType.GetElementType() '(실제 유형이'Mono.Cecil .TypeReference ')를'Mono.Cecil.GenericInstanceType ' "" – aethoric

+1

@aethoric : 이것은 비슷하지 않습니다. ElementType 속성을 사용하고 GetElementType 메서드는 사용하지 마십시오. 틀림없이 여기서 명명이 더 좋을 수도 있지만 ElementType은 형식 체인에서 직전 전임자를 반환하고 GetElementType은 루트 형식을 반환합니다. –

+0

굉장해, 고마워! – aethoric