这个问题已经在这里有一个答案:
- 匿名类型-是否有可区别的任何特点? 3个回答
在C#3.0,是有可能确定的实例是否Type
表示一个匿名类型?
这个问题已经在这里有一个答案:
在C#3.0,是有可能确定的实例是否Type
表示一个匿名类型?
即使一个匿名类型是普通的类型,你可以使用一些启发:
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#类的名字产生 - 用正则表达式这一点)。
匿名类型对象的属性
对于我的具体应用,如果命名空间为空,可以推断该类型是匿名的,所以检查的命名空间为空可能是最便宜的检查。
没有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;
}
在methadata和CLR没有这样的条款,匿名类型。 匿名类型是纯粹的编译器功能。
可能是有益的知道你为什么想知道这一点。 如果您执行以下命令:
var myType = new { Name = "Bill" };
Console.Write( myType.GetType().Name );
...你会看到类似“<> f__AnonymousType0`1”输出类型名称。 根据您的要求,您可以假设一种以<>,载“AnonymousType”和反引号字符是你在找什么。
这似乎匿名类型得到DebuggerDisplayAttribute
把他们其中Type = "<Anonymous Type>"
。
编辑:但是,只有当你在调试模式下进行编译。 该死。