문제

현실 세계에서 어떤 종류의 맞춤형 .NET 속성을 사용 했습니까?

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

그들이 유용 할 때 그들을 간과하고있을 것 같아요.

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

도움이 되었습니까?

해결책

나는 그것들을 유효성 검사를위한 "사용자 정의"속성 (예 : 내 자신의 "신용 카드 검증"으로 검증 할 필드 표시) 및 내가 작성한 사용자 정의 LinqTolucene 분석기 (예 : 지정된 필드에서 사용할 분석기를 지정)를 사용했습니다. .

예를 들어, 유효성 검사 코드는 다음과 같습니다.

public class Customer
{
     [CreditCardValidator]
     string creditCardNumber;

     [AddressValidator]
     string addressLineOne
}

위의 개체가 검증되면 각 필드는 "사용자 정의"속성 덕분에 적절한 유효성 검사기로 검증됩니다.

Linqtolucene 물건에서 나는 사용자 정의 속성을 썼습니다. 런타임에 (반사를 통해) 특정 필드를 찾을 수 있기 때문에 좋습니다. 예를 들어, 고객 객체가있는 경우 "index me"로 표시된 모든 속성을 얻는 데 관심이있을 수 있습니다. 사용자 정의 속성을 사용하면 객체에 대한 메타 데이터를 어떻게 노출시키기 때문에 쉽게이를 수행 할 수 있습니다. 쿼리하기 쉽습니다.

다른 팁

스크립팅 엔진을 만들고 [명령] 속성으로 다양한 메소드를 태그했습니다. 이는 이러한 기능이 스크립팅 엔진에 노출되었음을 의미했습니다.

예시:

[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>>

무엇보다도 런타임에 읽는 EBNF를 지정하여 즉시 사용자 정의 파서를 생성하고 데이터베이스 필드에 대한 메타 데이터를 지정하는 데 사용했습니다.

나는 일반적으로 커스텀 속성을 사용하는 하나의 '패턴'을 발견한다는 것은 특히 코드의 다른 장소에서 열거에 의존하는 경우 열거를 대체하는 것입니다.

예를 들어 물체 상태에 대한 열거가있을 수 있습니다. 이 상태를 바탕으로 코드에는 3 ~ 4 개의 다른 장소를 가지고 있으며, 그 열거의 '스위치'를 수행하고 일부 작업을 수행 할 수 있습니다. 일부 다른 개발자는 새로운 열거를 추가하여 버그를 쉽게 도입 할 수 있지만 코드의 다른 곳에서 스위치 문 중 하나에서 처리하지는 않습니다.

이를 피하기 위해 정적 클래스로 선언 된 사용자 정의 속성을 만듭니다. 사용자 정의 속성은 클래스의 정적 생성자에 사전에로드되며 코드의 모든 장소는 스위치 문 대신 사전을 사용합니다. 사용자 정의 속성 생성자는 각 스위치 문에 대한 '하드 코딩 된'값을 포함합니다.

일부 객체를 사용자 정의 (레거시) 형식으로 직렬화해야했으며 속성을 사용하여 직렬화되어야하는 필드와 포맷 방법을 식별했습니다. 그런 다음 이러한 속성을 가진 객체를 가져 와서 반사를 사용하여 포맷 할 수있는 직렬 라이저가있었습니다.

아직 사용자 정의 속성에 대한 사용을 찾지 못했습니다. 내가 적절할 수도 있지만, 맞춤 속성을 읽는 데 관련된 반사는 상당히 비싸기 때문에 내가 그것을 사용하지 않았지만 그것들을 사용하지 않은 몇 가지 상황이있었습니다.

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

우리의 도메인에서, 그 예는 가족 내의 특정 차량을 모델링하는 플러그인입니다. 차량 패밀리를위한 하나의 플러그인은 실제로 차량 패밀리 내에서 여러 차량 모델 (예 : "MX-6", "Probe")을 모델링 할 수 있습니다. ID 또는 모델 이름이 사용자 정의 속성 배열로 포함 된 경우 사용자 정의 속성이없는 DLL을 신속하게 무시한 다음 관심있는 차량을 모델링하지 않는 것을 무시할 수 있습니다.

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

이 프레임 워크는 "Skyframework"라고 불렸지만 OpenSource는 아닙니다.

예를 들어 거친 예제 ...

다른 OpenSource 프로젝트에서도 비슷한 예를 찾을 수 있습니다.

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

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

참고 : "테이블", "열"속성은 당시의 사용자 정의 속성이었습니다.

ActiveRecord 엔진은 이러한 속성의 객체를 구문 분석하고 CRUD ... 등에 대한 각 기능을 생성합니다.

마찬가지로, 나는 벤치마킹 해야하는 코드 부분을 식별하기위한 몇 가지 사용자 정의 속성을 개발했습니다.

[Sky.BenchMark()]
public void LongRunningMethod(..)
{
}

위의 속성으로 표시된 메소드는 자동으로 벤치가 표시되고 로그가 생성됩니다. 이것들은 이전의 일부 구현이었습니다.

주제에 대한 애원 책이 있습니다 ...NET 속성을 적용합니다 당신에게 도움이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top