Как проверить, является ли тип анонимным?
У меня есть следующий метод, который сериализует объект в HTML-тег. Я только хочу сделать это, хотя если тип не является анонимным.
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
}
}
Может кто-нибудь показать мне, как это сделать?
Спасибо
Ответы
Ответ 1
С 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.HasFlag(TypeAttributes.NotPublic);
}
РЕДАКТИРОВАТЬ:
Еще одна ссылка с методом расширения: определение того, является ли тип анонимным типом
Ответ 2
Быстрая и грязная:
if(obj.GetType().Name.Contains("AnonymousType"))
Ответ 3
Вы можете просто проверить, является ли пространство имен нулевым.
public static bool IsAnonymousType(this object instance)
{
if (instance==null)
return false;
return instance.GetType().Namespace == null;
}
Ответ 4
Хорошо, сегодня компилятор генерирует анонимные типы в качестве общих и закрытых классов. Парадоксальная комбинация, поскольку специализация родового класса - это своего рода наследование, не так ли?
Поэтому вы можете проверить это:
1. Это общий тип?
Да = > 2) является его определение герметичным && не публично?
Да = > 3) является ли его определение атрибутом CompilerGeneratedAttribute?
Я думаю, если эти три критерия истинны вместе, у нас есть анонимный тип...
Ну... Существует проблема с ЛЮБОЙ из описанных методов - это аспекты использования, которые могут измениться в следующих версиях .NET, и так будет до тех пор, пока Microsoft не добавит свойство IsAnonymous boolean для класса 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());
}
}
Ответ 5
Проверьте CompilerGeneratedAttribute
и DebuggerDisplayAttribute.Type
вот код, сгенерированный компилятором для анонимного типа
[CompilerGenerated, DebuggerDisplay(@"\{ a = {a} }", Type="<Anonymous Type>")]
internal sealed class <>f__AnonymousType0<<a>j__TPar>
{
...
}