C\#속성 Attribute

6992 단어 c#속성attribute
속성 Attributes 라 는 물건 을 사용 하면 N 다 중 코드 를 절약 할 수 있 습 니 다.
속성
속성 Attributes 는 C\#에서 자주 사용 되 지만 사실 많은 사람들 이 이 물건 에 대해 낯 설 어 합 니 다.
개념 적 으로 속성 은 메타 데 이 터 를 요소 와 관계 시 키 는 방식 을 제공한다.
속성 을 사용 하 는 모습 은 모두 본 적 이 있 을 것 입 니 다:

[Flags] //Attribute
public enum DayOfWeek
{
    Sunday = 1,
    Monday = 2,
    Tuesday = 4,
    Wednesday = 8,
    Thursday = 16,
    Friday = 32,
    Saturday = 64
}
코드 에서 Flags 는 하나의 속성 입 니 다.
일반적으로 속성 은 클래스,필드,방법 등 정의 위 에 놓 여 특정한 내용 을 지정 합 니 다.
.Net Framework 프레임 워 크 는 일부 속성 을 제공 합 니 다.일반적인 Serializable 처럼 컴 파일 러 의 현재 클래스 를 JSON 이나 XML 로 정렬 할 수 있 음 을 알려 줍 니 다.

[Serializable]
public class SerializableClass { /*...*/ }

주의해 야 할 것 은 속성 이 컴 파일 할 때 프로그램 집중 에 삽 입 됩 니 다.이렇게 하면 우 리 는 반 사 를 사용 하여 상응하는 속성 치 를 얻 을 수 있다.
2.사용자 정의 속성
사용자 정의 속성 은 용도 가 매우 커서 내 가 비교적 자주 사용 하 는 기술 이 라 고 할 수 있다.
사용자 정의 속성 은 System.Attribute 추상 클래스 에서 계승 해 야 합 니 다.
한 장면 을 상상 하 다.우 리 는 휴대 전화 종 류 를 구축 하고 있다.우 리 는 핸드폰 의 일부 정 보 를 나타 내 는 속성 이 필요 하 다.예 를 들 어 입 간판 과 생산 연도 등 이다.

public class MobileInformationAttribute : Attribute
{
    public string brand { get; set; }
    public int yearOfProduct { get; set; }

    public MobileInformationAttribute(string Brand, int YearOfProduct)
    {
        brand = Brand;
        yearOfProduct = YearOfProduct;
    }
}

우 리 는 속성 은 하나의 클래스 로 다른 클래스 와 마찬가지 로 필드,방법,구조 함수 와 다른 구성원 을 가지 고 있다 는 것 을 알 게 될 것 이다.
3.사용 속성
앞에서 말 했 듯 이 속성 은 클래스,필드,방법 등 정의 위 에 놓 을 수 있다.
위 에 있 는 사용자 정의 속성의 사용 을 살 펴 보 겠 습 니 다.

[MobileInformation("Apple", 2021)]
public class IPhone12 { /*...*/ }
사용자 정의 속성 이름 에 대해 xxx+Attribute 이름 을 사용 하면 짧 은 이름 xxx 를 사용 할 수 있 습 니 다.그렇지 않 으 면 완전한 이름 을 사용 해 야 합 니 다:

public class abc : Attribute { /*...*/ }

[abc("Apple", 2021)]
public class IPhone12 { /*...*/ }

4.제한 속성
속성 자체 도 하나의 클래스 입 니 다.그래서 속성 도 속성 으로 지정 하고 수식 할 수 있 습 니 다.
속성 을 수식 하 는 속성 중 한 프레임 의 속성 이 많이 사용 되 는데 그것 이 바로 Attribute Usage 입 니 다.이 속성 은 사용자 정의 속성 을 수정 할 수 있 는 요소 형식 을 제한 하 는 데 사 용 됩 니 다:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
public class MobileInformationAttribute : Attribute { /*...*/ }
AttributeTargets 는 클래스,인터페이스,방법,구조 함수,매 거,프로그램 집합 등 여러 가지 옵션 이 있 습 니 다.
위의 코드 에서 우 리 는 속성 을 지정 과 수식 류 와 인터페이스 에 만 사용 하도록 제한 했다.따라서 이 속성 으로 필드 를 수식 하면 컴 파일 러 가 잘못 보고 할 수 있 습 니 다.
Attribute Usage 는 수식 대상 에서 물 려 받 은 대상 을 정의 할 수 있 습 니 다.속성 도 얻 을 수 있 습 니까?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, Inherited = true)]
public class MobileInformationAttribute : Attribute { /*...*/ }
그리고 이 속성 은 한 요소 에 여러 개의 인 스 턴 스 를 가 질 수 있 습 니까?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)]
public class MobileInformationAttribute : Attribute { /*...*/ }
5.접근 속성
속성 이 생 겼 는데 어떻게 방문 합 니까?
프레임 워 크 는 Attribute.GetCustomAttribute()방법 을 제공 합 니 다.

var mobileType = typeof(IPhone12);
var attributeType = typeof(MobileInformationAttribute);
var attribute = (MobileInformationAttribute)Attribute.GetCustomAttribute(mobileType, attributeType);
Console.WriteLine($"Mobile is {attribute.brand} {attribute.yearOfProduct}");
6.반사 방문
반사 의 가장 중요 한 역할 은 대상 자체 의 데이터 가 아니 라 대상 의 데 이 터 를 수집 하 는 것 이다.이 데 이 터 는 대상 의 유형 과 대상 구성원(방법,속성,구조 함수 포함)에 대한 정보,그리고 특정 프로그램 집합 에 대한 정 보 를 포함한다.그 밖 에 요소 속성 에 저 장 된 모든 정보 도 포함한다.
가장 간단 한 반 사 는 GetType()방법 이다.

int myInt = 5;
Type type = myInt.GetType();
Console.WriteLine(type);
그 밖 에 저 희 는 주어진 형식 을 포함 하 는 프로그램 집합 에 대한 정 보 를 반사 적 으로 얻 을 수 있 습 니 다.

Assembly assembly = typeof(DateTime).Assembly;
Console.WriteLine(assembly);

Assembly mobileAssembly = typeof(IPhone12).Assembly;
Console.WriteLine(mobileAssembly);

반 사 된 내용 에 관 해 서 는 토론 을 전개 하지 않 는 다.
여기 서 말 하 는 것 은 반 사 를 통 해 클래스 의 방법 에 대한 정 보 를 얻 는 것 이다.

public class ReflectedClass
{
    public string Property1 { get; set; }

    public int Add(int first, int second)
    {
        return first + second;
    }
}

ReflectedClass reflected = new ReflectedClass();
MemberInfo member = reflected.GetType().GetMethod("Add");
Console.WriteLine(member); //Int32 Add(Int32, Int32)

마찬가지 로 반 사 를 통 해 정 의 된 속성 에 대한 정보 와 대상 의 구조 함수 에 대한 정 보 를 얻 을 수 있다.

PropertyInfo property = reflected.GetType().GetProperty("Property1");
Console.WriteLine(property); //System.String Property1

ConstructorInfo constructor = reflected.GetType().GetConstructor(new Type[0]);
Console.WriteLine(constructor); //Void .ctor()

7.반사 생 성 인 스 턴 스 사용
이 건 system.activator 가 필요 합 니 다.이것 은 매우 강력 한 클래스 로 유형 에서 대상 을 만 들 수 있 는 인 스 턴 스 입 니 다.
이 방법의 사용 을 살 펴 보 자.

ReflectedClass newReflected = new ReflectedClass();

var reflectedType = newReflected.GetType();

object newObject = Activator.CreateInstance(reflectedType);
Console.WriteLine(newObject);

8.반사 처리 범 형 사용
반사 처리 범 형 을 사용 하 는 것 은 일반 유형 을 처리 하 는 것 보다 좀 번 거 로 울 것 이다.
여기 서 Type 류 에 표지 유형 이 일반적인 지 아 닌 지 를 알 아야 합 니 다.

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7 };
Console.WriteLine(numbers.GetType().IsGenericType);
마찬가지 로 우 리 는 반사 로 일반적인 인 스 턴 스 를 만 들 수 있다.

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7 };

Type d = numbers.GetType().GetGenericTypeDefinition();

Type[] typeArgs = new Type[] { typeof(int) };

Type constructed = d.MakeGenericType(typeArgs);

object list = Activator.CreateInstance(constructed);

Console.WriteLine(list.GetType());

좀 복잡 하지만 실현 할 수 있다.
9.총화
좀 난잡 하 게 쓴 것 같다.
요약 하면 속성 은 메타 데 이 터 를 요소 에 배분 하 는데 유형,필드,방법 등 을 포함한다.이 메타 데 이 터 는 프로젝트 를 구축 할 때 요소 의 데이터 가 아 닌 요 소 를 컴 파일 하고 설명 합 니 다.
Attribute 클래스 에서 계승 할 사용자 정의 속성 을 만 들 수 있 습 니 다.Attribute Usage 속성 을 사용 하여 이 속성의 사용 위 치 를 제한 하고 반사 로 속성 데 이 터 를 얻 을 수 있 습 니 다.
반 사 는 원소 자체 가 아 닌 원소 에 대한 메타 데이터 와 정 보 를 얻 을 수 있 는 기술 이다.반 사 를 실행 하 는 가장 기본 적 인 방법 은 GetType()방법 을 사용 하 는 것 이지 만 반사 로 방법,구조 함수,필드 등에 대한 정 보 를 얻 을 수 있다.
대상 의 유형 만 있 으 면 반사 로 대상 의 인 스 턴 스 를 만 들 수 있 습 니 다.또한 반사 로 범 형 대상 을 만 드 는 것 은 가능 하지만 복잡 하 므 로 범 형 대상 의 유형 과 모든 범 형 매개 변수 유형 이 필요 합 니 다.
C\#의 속성 Attribute 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#속성 Attribute 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기