确定类型是不是为匿名类型
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 = "<Anonymous Type>"
的位置加上DebuggerDisplayAttribute
。
编辑:但仅当您在调试模式下编译时。该死。
【讨论】:
以上是关于确定类型是不是为匿名类型的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin函数 ⑤ ( 匿名函数变量类型推断 | 匿名函数参数类型自动推断 | 匿名函数又称为 Lambda 表达式 )