繁体   English   中英

获取用作通用类型参数的所有类型

[英]Get all types that are used as generic type arguments

是否可以获取在某些程序集中用作通用类型参数的所有类型?

基本上,假设我有这个课程:

public class Foo<T>
{
    T SomeProperty {get; set;}
}

现在,我有一个应用程序,在这里我可以通过某种方式使用上面的代码:

var stringFoo = new Foo<string>();
var intFoo = new Foo<int>();

假设这是Foo使用的唯一位置。 现在,我想获取Foo<string>Foo<int>类型定义。 即我想找到在给定程序Foo<T>由通用类型定义( Foo<T> )构造的所有类型。

那有可能吗?

更正...仍然很痛苦...但是不需要额外的库。 现在...在我的头顶上,有很多地方可以找到类型Foo<>

  • 属性( [MyAttribute(typeof(Foo<>)]Foo<>本身就是Attribute

  • 基本类型链( class MyClass : Foo<int> ),或者如果Foo<>IFoo<>则实现接口

  • 类型的成员(字段,属性,事件,方法)(这里我仅指那些签名部分,因此字段类型,方法参数和返回类型...)

  • 一个类型的内部类型(在另一个类型内部定义的类型)

所有这些都可以通过反射的“简单”应用程序找到。

最重要的是,您可以查看方法/属性的局部变量(最后是方法),事件(甚至最后是方法):如果有MethodInfo method ,则可以获得MethodBody body = method.GetMethodBody()MethodBody定义了LocalVariables

请注意,如果不反汇编代码(例如,使用Mono.Cecil ),您将无法在

public class C
{
    public List<int> MyList;

    public void M()
    {
        MyList = new List<int>();
        Console.WriteLine(new List<int>());
    }
}

该方法M使用List<int>()因为型的没有局部变量List<int>时使用。 因此,最后您甚至需要反汇编所有方法。

显然,每找到一个类型的时候,你必须检查类型是Foo<>的一个子类Foo<>或者使用Foo<>作为参数( List<Foo<>> ),或者是一个指针Foo<>*或托管指针ref Foo<>或...)

就变量而言,您可以通过检查方法来发现类型。

public static void GetGenericVariables()
{
    //Declaring two variables here that use Foo<>
    var inttype = new Foo<int>();
    var stringType = new Foo<string>();

    var methodInfo = typeof(ClassContainingMethod).GetMethod("GetGenericVariables");
    var variables = methodInfo.GetMethodBody().LocalVariables;
    foreach (var variable in variables)
    {
        if (variable.LocalType.IsGenericType && variable.LocalType.GetGenericTypeDefinition() == typeof(Foo<>))
        {
            Console.WriteLine(variable.LocalType.GenericTypeArguments[0].FullName);
        }
    }
}

输出:

System.Int32

System.String

但是,您将必须递归处理程序集和类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM