LINQ 나온 이후로 익명 타입을 즐겨 쓰시는 분이 좀 많으실겁니다.

네. 정말 편리하죠. 익명 타입을 파라미터로 쓰기도 하고, 익명 타입 데이터를 받기 위해 리플렉션도 하고.

이러다 닷넷에 깊숙히 들어가겠습니다..ㅋㅋ


익명 타입을 정확히 알아내는 방법에 대해 고민하시는 분들이 꽤나 많으실겁니다.

Object 이긴 한데 너무 포괄적이고 그렇다고 어디에 상속되있는지 어떻게 감지할지 모르겠고.

그래서 오늘 이 팁을 통해 익명 타입에 대한 원리를 정확히 알고 짚고 넘어가세요.

익명 타입을 알아내는 소스입니다.


네임 스페이스는 아래와 같습니다.

using System;
using System.Reflection;
using System.Runtime.CompilerServices;

그리고 그 확인 소스입니다. Mono 에서도 먹힌다고 합니다.


익명 타입인가?
  1. public static bool IsAnonymousType(object source)
  2.         {
  3.             if (source == null)
  4.             {
  5.                 return false;
  6.             }
  7.  
  8.             var type = source.GetType();
  9.  
  10.             return type.IsGenericType
  11.                    && (type.Attributes & TypeAttributes.NotPublic) == TypeAttributes.NotPublic
  12.                    && (type.Name.StartsWith("<>", StringComparison.OrdinalIgnoreCase) || type.Name.StartsWith("VB$", StringComparison.OrdinalIgnoreCase))
  13.                    && (type.Name.Contains("AnonymousType") || type.Name.Contains("AnonType"))
  14.                    && Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false);
  15.         }


익명 타입의 특징은 이렇습니다.

  • CompilerGenerated 특성이 적용됩니다.
  • 제네릭 타입입니다. 의외네요.
  • 클래스 이름에 "AnonymousType" 라는 문구가 포함됩니다.
  • 클래스 이름 머릿말에 C# 의 경우 "<>", VB의 경우 VB$ 로 시작됩니다.
  • 클래스는 public 이 아닙니다.


어때요. 참 쉽죠? 이제 익명 타입 속편하게 받아주세요.

출처 : http://jclaes.blogspot.com/2011/05/checking-for-anonymous-types.html





profile
20대 언제나 쿨한 개발(犬足)자.