如何testing一个types是匿名的?

我有以下方法将对象序列化为HTML标记。 我只想这样做,但如果types不是匿名的。

private void MergeTypeDataToTag(object typeData) { if (typeData != null) { Type elementType = typeData.GetType(); if (/* elementType != AnonymousType */) { _tag.Attributes.Add("class", elementType.Name); } // do some more stuff } } 

有人可以告诉我如何做到这一点?

谢谢

来自: http : //www.liensberger.it/web/blog/?p=191

 private static bool CheckIfAnonymousType(Type type) { if (type == null) throw new ArgumentNullException("type"); // HACK: The only way to detect anonymous types right now. return Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false) && type.IsGenericType && type.Name.Contains("AnonymousType") && (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$")) && (type.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic; } 

HTH。

编辑:
使用扩展方法的另一个链接: 确定types是否为匿名types

快速和肮脏:

 if(obj.GetType().Name.Contains("AnonymousType")) 

你可以检查命名空间是否为空。

 public static bool IsAnonymousType(this object instance) { if (instance==null) return false; return instance.GetType().Namespace == null; } 

那么,今天compiier生成匿名types为通用和密封类。 generics类的专业化是一种inheritance,是不是一种矛盾的组合? 所以你可以检查这个:1.这是一个genericstypes? 是=> 2)是否定义密封&&不公开? 是=> 3)它的定义是否具有CompilerGeneratedAttribute属性? 我想,如果这三个标准是真的在一起,我们有一个匿名types…嗯…所描述的任何方法都有问题 – 它们是在下一个版本的.NET中可能会改变的使用方面,它会所以直到微软将IsAnonymous布尔属性添加到Type类。 希望它在我们都死之前就会发生…直到那一天,它可以这样检查:

 using System.Runtime.CompilerServices; using System.Reflection; public static class AnonymousTypesSupport { public static bool IsAnonymous(this Type type) { if (type.IsGenericType) { var d = type.GetGenericTypeDefinition(); if (d.IsClass && d.IsSealed && d.Attributes.HasFlag(TypeAttributes.NotPublic)) { var attributes = d.GetCustomAttributes(typeof(CompilerGeneratedAttribute), false); if (attributes != null && attributes.Length > 0) { //WOW! We have an anonymous type!!! return true; } } } return false; } public static bool IsAnonymousType<T>(this T instance) { return IsAnonymous(instance.GetType()); } } 

检查CompilerGeneratedAttributeDebuggerDisplayAttribute.Type

这里是编译器为一个不规则types生成的代码

 [CompilerGenerated, DebuggerDisplay(@"\{ a = {a} }", Type="<Anonymous Type>")] internal sealed class <>f__AnonymousType0<<a>j__TPar> { ... }