다음을 통해 공유


특성

특성은 메타데이터 또는 선언적 정보를 코드(어셈블리, 형식, 메서드, 속성 등)와 연결하기 위한 강력한 메서드를 제공합니다. 특성이 프로그램 엔터티와 연결되면 리플렉션 기술을 사용하여 런타임에 특성을 쿼리할 수 있습니다.

특성에는 다음과 같은 속성이 있습니다.

  • 특성은 프로그램에 메타데이터를 추가합니다. 메타데이터 프로그램에 정의된 형식에 대한 정보입니다. 모든 .NET 어셈블리에는 어셈블리에 정의된 형식 및 형식 멤버를 설명하는 지정된 메타데이터 집합이 포함되어 있습니다. 사용자 지정 특성을 추가하여 필요한 추가 정보를 지정할 수 있습니다.
  • 전체 어셈블리, 모듈 또는 클래스 및 속성과 같은 더 작은 프로그램 요소에 하나 이상의 특성을 적용할 수 있습니다.
  • 특성은 메서드 및 속성과 동일한 방식으로 인수를 수락할 수 있습니다.
  • 프로그램은 리플렉션을 사용하여 다른 프로그램의 자체 메타데이터 또는 메타데이터를 검사할 수 있습니다.

리플렉션 어셈블리, 모듈 및 형식을 설명하는 개체(Type형식)를 제공합니다. 리플렉션을 사용하여 형식의 인스턴스를 동적으로 만들거나, 형식을 기존 개체에 바인딩하거나, 기존 개체에서 형식을 가져와 해당 메서드를 호출하거나 해당 필드 및 속성에 액세스할 수 있습니다. 코드에서 특성을 사용하는 경우 리플렉션을 통해 해당 특성에 액세스할 수 있습니다. 자세한 내용은 특성참조하세요.

다음은 Object 기본 클래스의 모든 형식에서 상속된 GetType() 메서드를 사용하여 변수 형식을 가져오는 간단한 리플렉션 예제입니다.

메모

.cs 파일의 맨 위에 using System;using System.Reflection; 추가해야 합니다.

// Using GetType to obtain type information:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);

출력 내용: System.Int32.

다음 예제에서는 리플렉션을 사용하여 로드된 어셈블리의 전체 이름을 가져옵니다.

// Using Reflection to get information of an Assembly:
Assembly info = typeof(int).Assembly;
Console.WriteLine(info);

출력은 다음과 같습니다. System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e.

메모

protectedinternal C# 키워드는 IL(중간 언어)에 의미가 없으며 리플렉션 API에 사용되지 않습니다. IL의 해당 용어는 Family어셈블리. 리플렉션을 사용하여 internal 메서드를 식별하려면 IsAssembly 속성을 사용합니다. protected internal 메서드를 식별하려면 IsFamilyOrAssembly사용합니다.

특성 사용

특성은 거의 모든 선언에 배치할 수 있지만 특정 특성은 유효한 선언 형식을 제한할 수 있습니다. C#에서는 적용되는 엔터티 선언 위에 대괄호([])로 묶인 특성의 이름을 배치하여 특성을 지정합니다.

이 예제에서 SerializableAttribute 특성은 클래스에 특정 특성을 적용하는 데 사용됩니다.

[Serializable]
public class SampleClass
{
    // Objects of this type can be serialized.
}

특성이 DllImportAttribute 메서드는 다음 예제와 같이 선언됩니다.

[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();

다음 예제와 같이 선언에 둘 이상의 특성을 배치할 수 있습니다.

void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }

일부 특성은 지정된 엔터티에 대해 두 번 이상 지정할 수 있습니다. 이러한 다중 사용 특성의 예는 다음과 ConditionalAttribute.

[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
    // ...
}

메모

규칙에 따라 모든 특성 이름은 "특성"이라는 단어로 끝나 .NET 라이브러리의 다른 항목과 구분됩니다. 그러나 코드에서 특성을 사용할 때는 특성 접미사를 지정할 필요가 없습니다. 예를 들어 [DllImport][DllImportAttribute]동일하지만 DllImportAttribute .NET 클래스 라이브러리에 있는 특성의 실제 이름입니다.

특성 매개 변수

많은 특성에는 위치, 명명되지 않은 또는 명명될 수 있는 매개 변수가 있습니다. 위치 매개 변수는 특정 순서로 지정해야 하며 생략할 수 없습니다. 명명된 매개 변수는 선택 사항이며 어떤 순서로든 지정할 수 있습니다. 위치 매개 변수가 먼저 지정됩니다. 예를 들어 다음 세 가지 특성은 동일합니다.

[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]

첫 번째 매개 변수인 DLL 이름은 위치 기반이며 항상 먼저 제공됩니다. 다른 매개 변수들은 이름이 지정됩니다. 이 경우 명명된 매개 변수는 모두 false로 기본 설정되므로 생략할 수 있습니다. 위치 매개 변수는 특성 생성자의 매개 변수에 해당합니다. 명명된 매개 변수 또는 선택적 매개 변수는 특성의 속성 또는 필드에 해당합니다. 기본 매개 변수 값에 대한 자세한 내용은 개별 특성 설명서를 참조하세요.

허용되는 매개 변수 형식에 대한 자세한 내용은 C# 언어 사양특성 섹션을 참조하세요.

특성 대상

특성의 대상은 특성이 적용되는 엔터티입니다. 예를 들어 특성은 클래스, 특정 메서드 또는 전체 어셈블리에 적용될 수 있습니다. 기본적으로 특성은 뒤에 있는 요소에 적용됩니다. 그러나 예를 들어 특성이 메서드에 적용되는지, 매개 변수에 적용되는지 또는 반환 값에 적용되는지 여부를 명시적으로 식별할 수도 있습니다.

특성 대상을 명시적으로 식별하려면 다음 구문을 사용합니다.

[target : attribute-list]

가능한 target 값 목록은 다음 표에 나와 있습니다.

대상 값 적용 대상
assembly 전체 어셈블리
module 현재 어셈블리 모듈
field 클래스 또는 구조체의 필드
event 이벤트
method 메서드 또는 getset 속성 접근자
param 메서드 매개 변수 또는 set 속성 접근자 매개 변수
property 재산
return 메서드, 속성 인덱서 또는 get 속성 접근자의 반환값
type 구조체, 클래스, 인터페이스, 열거형 또는 대리자

자동으로 구현된 속성에 대해 생성된 지원 필드에 특성을 적용하기 위해 field 대상 값을 지정합니다.

다음 예제에서는 어셈블리 및 모듈에 특성을 적용하는 방법을 보여 줍니다. 자세한 내용은 공통 특성(C#)참조하세요.

using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]

다음 예제에서는 C#의 메서드, 메서드 매개 변수 및 메서드 반환 값에 특성을 적용하는 방법을 보여 줍니다.

// default: applies to method
[ValidatedContract]
int Method1() { return 0; }

// applies to method
[method: ValidatedContract]
int Method2() { return 0; }

// applies to parameter
int Method3([ValidatedContract] string contract) { return 0; }

// applies to return value
[return: ValidatedContract]
int Method4() { return 0; }

메모

ValidatedContract 유효한 것으로 정의된 대상에 관계없이 반환 값에만 적용하도록 ValidatedContract 정의된 경우에도 return 대상을 지정해야 합니다. 즉, 컴파일러는 AttributeUsage 정보를 사용하여 모호한 특성 대상을 해결하지 않습니다. 자세한 내용은 AttributeUsage참조하세요.

특성에 대한 일반적인 사용

다음 목록에는 코드에서 특성의 몇 가지 일반적인 용도가 포함되어 있습니다.

  • 웹 서비스에서 WebMethod 특성을 사용하여 메서드를 표시하여 SOAP 프로토콜을 통해 메서드를 호출할 수 있어야 함을 나타냅니다. 자세한 내용은 WebMethodAttribute참조하세요.
  • 네이티브 코드와 상호 운용할 때 메서드 매개 변수를 마샬링하는 방법을 설명합니다. 자세한 내용은 MarshalAsAttribute참조하세요.
  • 클래스, 메서드 및 인터페이스에 대한 COM 속성을 설명합니다.
  • DllImportAttribute 클래스를 사용하여 관리되지 않는 코드 호출
  • 타이틀, 버전, 설명 또는 상표 측면에서 어셈블리를 설명합니다.
  • 지속성을 위해 serialize할 클래스의 멤버를 설명합니다.
  • XML serialization을 위해 클래스 멤버와 XML 노드 간에 매핑하는 방법을 설명합니다.
  • 메서드에 대한 보안 요구 사항을 설명합니다.
  • 보안을 적용하는 데 사용되는 특성을 지정합니다.
  • 코드를 디버그하기 쉽게 유지하도록 JIT(Just-In-Time) 컴파일러를 통해 최적화를 제어합니다.
  • 메서드 호출자에 대한 정보를 가져옵니다.

리플렉션 개요

리플렉션은 다음과 같은 경우에 유용합니다.

  • 프로그램 메타데이터의 특성에 액세스해야 하는 경우 자세한 내용은 특성에 저장된 정보 검색 을 참조하세요.
  • 어셈블리에서 형식을 검사하고 인스턴스화하는 경우
  • 런타임에 새 형식을 빌드하는 경우 System.Reflection.Emit클래스를 사용합니다.
  • 런타임에 생성된 형식의 메서드에 액세스하여 지연 바인딩을 수행합니다. 문서 동적으로 로드 및 사용 형식을 참조하세요.

자세한 내용은 다음을 참고하세요.