C\#속성 Attribute
속성
속성 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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.