确定Type是否为匿名类型

时间:2009-10-30 15:59:00

标签: c# .net .net-3.5 c#-3.0 anonymous-types

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

6 个答案:

答案 0 :(得分:37)

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

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#类名称 - 请使用正则表达式)。

答案 1 :(得分:14)

匿名类型对象的属性

  • 的命名空间等于null
  • System.Object的基本类型
  • IsSealed = true
  • 自定义属性0是DebuggerDisplayAttribute,类型:“”
  • IsPublic = false

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

答案 2 :(得分:5)

没有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;
}

答案 3 :(得分:2)

在美沙酮和CLR中没有匿名类型的术语。匿名类型只是编译器功能。

答案 4 :(得分:1)

可能有助于了解您为何想知道这一点。如果执行以下操作:

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

...你会看到像“&lt;&gt; f__AnonymousType0`1”这样的输出作为类型名称。根据您的要求,您可以假设以&lt;&gt;开头的类型包含“AnonymousType”和后引号字符是您正在寻找的。

答案 5 :(得分:1)

似乎匿名类型会将DebuggerDisplayAttribute放在Type = "<Anonymous Type>"上。{/ p>

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