![](/img/trans.png)
[英]Why are reference types "slower" when used as generic type arguments in .NET 5?
[英]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.