Получить универсальные параметры из ByReferenceType с Mono.Cecil - PullRequest
2 голосов
/ 16 мая 2011

У меня есть метод, который получает параметр, такой как:

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

Использование Cecil для перечисления параметров приводит к ByReferenceType.Вызов GetElementType () при попытке разыменования параметра возвращает TypeReference с полным именем:

System.Action`1

Каким-то образом он потерял универсальные параметры и больше не является GenericInstanceType.

Как правильно разыменовать параметр byref и получить фактический общий тип экземпляра?

1 Ответ

2 голосов
/ 16 мая 2011

Вы можете погрузиться в 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построен.

...