确定类型是不是为匿名类型

Posted

技术标签:

【中文标题】确定类型是不是为匿名类型【英文标题】:Determining whether a Type is an Anonymous Type [duplicate]确定类型是否为匿名类型 【发布时间】:2010-12-11 15:54:41 【问题描述】:

在 C# 3.0 中,是否可以确定 Type 的实例是否代表匿名类型?

【问题讨论】:

另见答案:***.com/a/315186/46039 【参考方案1】:

即使匿名类型是普通类型,您也可以使用一些启发式方法:

public static class TypeExtension 

    public static Boolean IsAnonymousType(this Type type) 
        Boolean hasCompilerGeneratedAttribute = type.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false).Count() > 0;
        Boolean nameContainsAnonymousType = type.FullName.Contains("AnonymousType");
        Boolean isAnonymousType = hasCompilerGeneratedAttribute && nameContainsAnonymousType;

        return isAnonymousType;
    

另一个很好的启发式方法是类名是否是有效的 C# 名称(生成匿名类型时没有有效的 C# 类名 - 为此使用正则表达式)。

【讨论】:

@Philip 但并非万无一失,请参阅此问题。 @MattWarren,哪个问题? 在单声道上这个type.FullName.Contains("AnonymousType"); 不是真的。 仅供参考 - 如果您从泛型类或函数中检查类型,这将不起作用 澄清:如果您正在检查泛型类/方法中的类型参数,这将不起作用。改为检查对象的 .GetType() 结果的实际实例【参考方案2】:

匿名类型对象的属性

有一个等于 null 的命名空间 System.Object 的基本类型 IsSealed = true 自定义属性 0 为 DebuggerDisplayAttribute,类型:“” IsPublic = 假

对于我的特定应用程序,如果命名空间为 null,则可以推断该类型是匿名的,因此检查命名空间是否为 null 可能是成本最低的检查。

【讨论】:

谢谢,选择返回类型。NameSpace == null;将我的程序处理能力提高了近 50%(正在使用这种方法:***.com/questions/2483023/…) 是的。这应该是正确的答案。我认为任何合理的具体类都不会有一个空命名空间。 +1 谢谢!在这里留下我的评论是为了收藏这个答案(不仅仅是一个线程) 我认为全局类可以有 namespace == null;所以仅仅检查是不够的。 @沙尔克 @nawfal C# 没有概念(VB.NET 有,可能还有更多,但如果仅限于一种语言)。【参考方案3】:

没有 C# 语言结构允许您说“这是一个匿名类型”。如果一个类型是匿名类型,你可以使用一个简单的启发式来近似估计,但是它可能会被人们手工编写 IL 或使用其中的字符如 > 和

public static class TypeExtensions 
  public static bool IsAnonymousType(this Type t) 
    var name = t.Name;
    if ( name.Length < 3 ) 
      return false;
    
    return name[0] == '<' 
        && name[1] == '>' 
        && name.IndexOf("AnonymousType", StringComparison.Ordinal) > 0;

【讨论】:

【参考方案4】:

在元数据和 CLR 中没有匿名类型这样的术语。匿名类型只是编译器功能。

【讨论】:

【参考方案5】:

了解您为什么想知道这一点可能会有所帮助。如果您执行以下操作:

var myType = new  Name = "Bill" ;
Console.Write( myType.GetType().Name  );

...您会看到类似“f__AnonymousType0`1”的输出作为类型名称。根据您的要求,您可以假设以 开头、包含“AnonymousType”和反引号字符的类型就是您要查找的类型。

【讨论】:

不要担心为什么。这是好奇心:) 我也是这么想的,但是有点脏。如果他们在 c#5 中更改名称怎么办?任何使用它的代码都会被破坏。 询问和解释“为什么”很重要,因为通常还有其他可能的答案,如果不知道更多,这些答案可能从问题中看不出来。【参考方案6】:

似乎匿名类型会在Type = "&lt;Anonymous Type&gt;" 的位置加上DebuggerDisplayAttribute

编辑:但仅当您在调试模式下编译时。该死。

【讨论】:

以上是关于确定类型是不是为匿名类型的主要内容,如果未能解决你的问题,请参考以下文章

如何测试一个类型是不是是匿名的? [复制]

如何检查 C# 中的动态匿名类型上是不是存在属性?

C#超级有用的一种类型—匿名类型

超级实用的一种类型——匿名类型

转换为匿名类型

Kotlin函数 ⑤ ( 匿名函数变量类型推断 | 匿名函数参数类型自动推断 | 匿名函数又称为 Lambda 表达式 )