Is there any possibility to figure out whether a return or argument type of a member is dynamic
? The issue is that is compiles down to System.Object
.
I've observed that if a member accepting arguments has a dynamic
type present in its signature, an additional argument A_0
will be added.
Are there any more tricks to figure out that a type is dynamic
using reflection?
I'm using dnlib as my reflection library. The solution should work for all dotnet platforms; however, if it is limited to .NET Core, no biggie.
The project I'm working on is a Markdown documentation generator for C# libraries - you can find it here.
Thank you for any suggestions.
Update
Identifying types that are not part of generic type arguments is simple.
If a return type is dynamic, then the method/property getter/property setter/delegate/event adder will have an additional argument in their signature called A_0
.
If an argument is dynamic, then is will be decorated with a custom attribute: System.Runtime.CompilerServices.DynamicAttribute
.
However, if the dynamic type is an argument of some generic type (Dictionary<object, dynamic>
), then none of the generic argument types will be decorated with the custom attribute above. If the given generic type is returned by a member, then the additional argument will be present in the members signature. Same goes for if the generic type is an argument, it will be decorated with a custom attribute.
These indicators can be reliably used only if the generic type only either has only one argument or there is no other object
type argument:
<object, dynamic>
NOT OK<int, dynamic>
OK<dynamic>
OK
Neither the additional argument nor the custom attribute indicates which generic argument is dynamic.
So far, I do not see a solution for this issue.