确定类型是否是匿名类型[重复](Determining whether a Type is an A

2019-09-02 17:01发布

这个问题已经在这里有一个答案:

  • 匿名类型-是否有可区别的任何特点? 3个回答

在C#3.0,是有可能确定的实例是否Type表示一个匿名类型?

Answer 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#类的名字产生 - 用正则表达式这一点)。



Answer 2:

匿名类型对象的属性

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

对于我的具体应用,如果命名空间为空,可以推断该类型是匿名的,所以检查的命名空间为空可能是最便宜的检查。



Answer 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;
}


Answer 4:

在methadata和CLR没有这样的条款,匿名类型。 匿名类型是纯粹的编译器功能。



Answer 5:

可能是有益的知道你为什么想知道这一点。 如果您执行以下命令:

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

...你会看到类似“<> f__AnonymousType0`1”输出类型名称。 根据您的要求,您可以假设一种以<>,载“AnonymousType”和反引号字符是你在找什么。



Answer 6:

这似乎匿名类型得到DebuggerDisplayAttribute把他们其中Type = "<Anonymous Type>"

编辑:但是,只有当你在调试模式下进行编译。 该死。



文章来源: Determining whether a Type is an Anonymous Type [duplicate]