Skip to content

Instantly share code, notes, and snippets.

@terrajobst
Created April 15, 2019 23:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save terrajobst/18a3568f6e518d83d2d5679f7799ee8c to your computer and use it in GitHub Desktop.
Save terrajobst/18a3568f6e518d83d2d5679f7799ee8c to your computer and use it in GitHub Desktop.
Test_Unconstrained`1
    Name            : T
    Attributes      : None

Test_ConstrainedToObject`1
    Name            : T
    Attributes      : None
    Constraint Kind : TypeReference
    Constraint Type : System.Object

Test_ConstrainedToClass`1
    Name            : T
    Attributes      : ReferenceTypeConstraint

Test_ConstrainedToStruct`1
    Name            : T
    Attributes      : NotNullableValueTypeConstraint, DefaultConstructorConstraint
    Constraint Kind : TypeReference
    Constraint Type : System.ValueType
using System;
using System.IO;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
namespace ConsoleApp26
{
class Program
{
static void Main(string[] args)
{
var path = Environment.GetCommandLineArgs()[0];
using var stream = File.OpenRead(path);
using var peReader = new PEReader(stream);
var reader = peReader.GetMetadataReader();
foreach (var typeHandle in reader.TypeDefinitions)
{
var type = reader.GetTypeDefinition(typeHandle);
if (type.GetGenericParameters().Count == 0)
continue;
Console.WriteLine(reader.GetString(type.Name));
foreach (var parameterHandle in type.GetGenericParameters())
{
var parameter = reader.GetGenericParameter(parameterHandle);
Console.WriteLine($" Name : {reader.GetString(parameter.Name)}");
Console.WriteLine($" Attributes : {parameter.Attributes}");
foreach (var constraintHandle in parameter.GetConstraints())
{
var constraint = reader.GetGenericParameterConstraint(constraintHandle);
Console.WriteLine($" Constraint Kind : {constraint.Type.Kind}");
if (constraint.Type.Kind == HandleKind.TypeReference)
{
var constrainTypeReferenceHandle = (TypeReferenceHandle)constraint.Type;
var constrainTypeReference = reader.GetTypeReference(constrainTypeReferenceHandle);
Console.WriteLine($" Constraint Type : {reader.GetString(constrainTypeReference.Namespace)}.{reader.GetString(constrainTypeReference.Name)}");
}
}
}
Console.WriteLine();
}
}
}
class Test_Unconstrained<T>
{
}
class Test_ConstrainedToObject<T> where T: object
{
}
class Test_ConstrainedToClass<T> where T : class
{
}
class Test_ConstrainedToStruct<T> where T : struct
{
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment