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

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

【问题讨论】:

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


【解决方案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%(正在使用这种方法:stackoverflow.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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        相关资源
        最近更新 更多