8

실제 .NET 환경에서 사용자 지정 .NET 특성을 사용했을 때 어떤 점이 좋습니까?실제 .NET 사용자 정의 특성 사용

나는 그들에 관한 여러 기사를 읽었지만 사용자 정의 속성을 사용한 적이 없습니다.

내가 유용 할 때 그들을 바라 보았다고 생각합니다.

나는 프레임 워크에 이미 포함되어있는 속성이 아니라 만든 속성에 대해 이야기하고 있습니다.

+2

다른 SOFlow가 사용하는 방법은 다음과 같습니다. http://www.google.com/#hl=en&q=site%3Astackoverflow.com+.net+custom+attribute&aq=f&oq=&aqi=&fp=leBsIIJAIN0 – Sampson

답변

4

필자는 검증을 위해 "사용자 정의"속성 (즉, "신용 카드 유효성 검사"로 필드를 표시 함)과 필자가 작성한 사용자 정의 LinqToLucene 분석기를 사용했습니다 주어진 필드).

유효성 검사 코드는, 예를 들어, 다음과 같이 보일 것입니다 :

public class Customer 
{ 
    [CreditCardValidator] 
    string creditCardNumber; 

    [AddressValidator] 
    string addressLineOne 
} 

위의 객체가 검증

각 필드는 "사용자 정의"속성에 대한 적절한 검증 덕분에 확인된다.

사용자 지정 특성을 작성한 LinqToLucene 항목은 런타임시 특정 필드를 (반사를 통해) 찾을 수 있기 때문에 유용합니다. 예를 들어, 고객 개체가있는 경우 "인덱스 나"로 표시된 모든 속성을 가져올 수 있습니다. 사용자 지정 특성을 사용하면 개체에 대한 메타 데이터가 쿼리하기 쉽습니다.

0

일부 개체를 사용자 지정 (레거시) 형식으로 serialize해야하며 특성을 사용하여 어떤 필드를 serialize해야하며 서식을 지정해야합니다. 그런 다음 필자는 이러한 속성을 가진 객체를 취할 수있는 직렬기를 사용하여 리플렉션을 사용하여 형식을 지정했습니다.

+0

당신은 ' 정말로 자신 만의 맞춤 속성을 사용하고 있었습니까? –

+0

heeeeeeeeeeeeee – abmv

0

ActiveRecord 패턴을 기반으로 개발 한 ORM 프레임 워크 중 하나에서 사용했습니다. 이것은 LINQ, Castle 프로젝트 등에서 사용할 수있는 것과 같은 종류의 구현입니다.

프레임 워크는 "SkyFramework"라고 불렸지만 opensource가 아닙니다.

그냥 거친 예제 ...

다른 오픈 소스 프로젝트에서도 비슷한 예제를 찾을 수 있습니다.

[Sky.Table ("user")] 
public class User 
{ 
    [Sky.Column ("username")] 
    public string UserName; 

    [Sky.Column ("pwd")] 
    public string Password; 
} 

참고 : 속성 "표", "열"은 사용자가 그 시간에 속성을했다.

액티브 엔진 등 ...

마찬가지로 좀 맞춤 벤치마킹해야 할 코드의 일부를 식별하는 속성을 개발했다 .. 이러한 속성의 객체를 파싱 CRUD은 각각의 기능을 생성한다. 예를 들어

위의 속성으로 표시된 메소드는 자동으로 벤치 마크되고 로그가 생성됩니다. 이들은 몇 가지 초기 구현물입니다.

Applied .NET Attribues 주제에 관한 Apress 책이 있습니다. 도움이 될만한 자료가 있습니다.

+0

특성을 작성 했습니까? –

+0

테이블, 열, BenchMark 등은 Attribute 클래스에서 파생 된 개체입니다. 파서 엔진은 처리하는 것 외에도 처리합니다. 이러한 객체는 항상 일부 팩토리 클래스에 의해 인스턴스화되므로 메소드에 연결될 수 있습니다. –

+0

그리고 지금 가지고있는 LINQ의 비슷한 속성과 혼동하지 마십시오. 이것은 속성이 자신의 네임 스페이스에있는 오래된 코드입니다. –

1

다른 것들 중에서도 런타임에 사용자 정의 파서를 만들고 데이터베이스의 필드에 대한 메타 데이터를 지정하기 위해 런타임에 읽을 EBNF를 지정하는 데 사용했습니다.

내가 일반적으로 사용자 지정 특성을 사용하는 '패턴'은 코드에서 diff 위치의 열거 형에 대한 종속성이있을 때 열거 형을 대체하는 것입니다.

예. 나는 개체의 상태에 대한 열거 형을 가질 수 있습니다. 이 상태를 기반으로, 나는 열거 형의 '전환'을 수행하고 일부 작업을 수행하는 코드에서 3 ~ 4 개의 다른 위치를 가질 수 있습니다. 다른 개발자는 새로운 enum을 추가하지만 switch 문 중 하나에서 코드의 다른 부분을 처리하지 않으면 버그를 쉽게 도입 할 수 있습니다.

그래서 이것을 피하기 위해 정적 클래스로 선언 된 사용자 지정 특성을 만듭니다. 사용자 정의 속성은 클래스의 정적 생성자에 사전으로로드되며 코드의 모든 위치는 switch 문 대신 사전을 사용합니다. 사용자 지정 특성 생성자에는 각 switch 문에 대한 '하드 코드 된'값이 들어 있습니다.

5

스크립팅 엔진을 만들고 [Command] 속성을 사용하여 다양한 메서드를 태그했습니다. 이것은 이러한 기능이 스크립팅 엔진에 노출되었음을 의미합니다.

예 :

[Command(HelpText = "Lists active users")] 
void ListUsers(void) 
{ 

} 

[Command(HelpText = "Terminate a specific user's connection")] 
void EndConnection(int userID) 
{ 

} 

과 같은

사용 :

MyScriptEngine>> Help 
Available Commands are: 
    ListUsers: Lists active users 
    EndConnection {userID}: Terminate a specific user's connection 

MyScriptEngine>> EndConnection 3 
    User 3 (Michael) has had his connection terminated. 

MyScriptEngine>> 
0

은 정말 사용자의 사용은 아직 같은 속성을 발견하지 않았습니다. 내가 맞춤법 특성을 읽는 것과 관련된 반사가 상당히 비싸기 때문에 적절하다고 생각하지만 사용하지 않은 상황이 몇 가지 있습니다.

0

"플러그 인"DLL 내의 클래스에 사용자 지정 특성을 배치했습니다. 이를 통해 프레임 워크는 사용 가능한 플러그인을 동적으로 검색하고 관심있는 플러그인이 있는지 평가 한 다음 관심있는 플러그인을 동적으로로드 할 수 있습니다.

이 예는 가족 내의 특정 차량을 모델링하는 플러그인입니다. 차량 패밀리 용 플러그인 하나는 실제로 차량 패밀리 내에서 여러 차량 모델 (예 : "MX-6", "프로브")을 모델링 할 수 있습니다. ID 또는 모델 이름이 사용자 지정 특성 배열로 포함되어있는 경우 사용자 지정 특성이없는 DLL을 즉시 무시한 다음 해당 모델을 모델링하지 않은 DLL은 무시합니다.

관련 문제