Assembly.GetTypes()返回奇怪的类型名称,例如"<> c"

Eri*_*röm 22 .net c#

使用时,Assembly.GetTypes()我会获得以此为Type.Name开头的类型<>c.....

我试图谷歌,如果这是匿名类型或其他东西.但无法得到一个非常好的答案.

Type上是否有属性表明这些类型是什么?我不喜欢这样做if(type.Name.StartsWith("<>"))

Yuv*_*kov 36

这些是编译器生成的显示类.您可以通过查找以下内容来区分它们CompilerGeneratedAttribute:

var attr = Attribute.GetCustomAttribute(type, typeof(CompilerGeneratedAttribute));
Run Code Online (Sandbox Code Playgroud)

  • @Abdulkarim 类的实例和类型实例本身之间存在差异。“Type”实例也会根据您使用的每种类型加载到内存中,并且 CLR 不会卸载它们(只有在您关闭整个 AppDomain 时才会卸载)。即 `Assembly.GetType()` 返回类型为 `Type` 的实例。 (2认同)

Jon*_*nna 10

他们是编译器生成的类型,其中包括匿名类型,但也实现IEnumerable<T>,IEnumerator<T>,IEnumerableIEnumerator由制造yield和生产的状态机结构await.

他们会有CompilerGeneratedAttribute.

你将这些名称描述为"奇怪",并且它们是故意的.它们都是有效的.NET名称,但在常见的.NET语言中无效,特别是C#和VB.NET.这意味着您无法直接使用C#编码创建这样的类,因此不需要任何逻辑来检查程序员是否未创建匹配的类.

  • 和lambdas(特别是封闭).即使在C#5中编译成静态委托的内容现在也是Roslyn中名为`<> c`的类的单例实例变量(出于性能原因,因为在CLI中调用实例绑定委托更快). (2认同)

Rah*_*thi 6

这些是CompilerGeneratedAttribute类

将编译器生成的元素与用户生成的元素区分开。这个类不能被继承。

你可以像检查

using System.Runtime.CompilerServices;


bool CompilerGen(Type t)
{
    var attr = Attribute.GetCustomAttribute(t, typeof(CompilerGeneratedAttribute));
    return attr != null;
}
Run Code Online (Sandbox Code Playgroud)