문제

제목은 거의 모든 것을 말합니다. 수업을 통해 약간의 반영을 할 때 MemberInfo.getCustomAttributes () 메소드는 멤버의 속성 순서를 보존합니까? 공식 문서는 어떤 식 으로든 다른 방법으로 말하지 않습니다.


내가 왜 이것을 필요로하는지 궁금하다면 여기에 전체 설명이 있습니다. 지금은 문제가 생기기 때문에 길고 질문에 필요하지 않지만, 아마도 속성 열거 순서에 의존하지 않는 더 큰 문제에 대한 대체 솔루션을 제시 할 수 있습니다.

나는 매우 긴 수명을 가질 것으로 예상되는 (ASP.NET) 응용 프로그램에 대한 유연한 프레임 워크를 만들려고 노력하고 있습니다. 코스를 통해 메뉴에서 액세스 할 수있는 많은 형태를 얻을 수 있습니다. 개발자가 올 수있는 삶을 더 쉽게 만들기 위해 MenuItemAttribute 양식 클래스에 신청할 수 있습니다. 이 속성에는 생성자에 무제한 양의 문자열 매개 변수가있어 개발자가 메뉴에 양식이 정확히 존재하는 위치를 지정할 수 있습니다. 일반적인 사용 예제는 같은 것입니다 [MenuItem("Company", "Clients", "Orders")] 그러면 메뉴에 "주문"이있는 항목 "클라이언트"가있는 항목 "회사"가 있어야한다는 것을 의미합니다. 그러면 양식을 열게됩니다. 단일 양식에는 필요한 경우 여러 속성을 가질 수 있습니다. 그러면 메뉴의 여러 장소에서 고용 할 수 있습니다.

분명히 전체 메뉴는 내 어셈블리의 모든 클래스를 열거 하고이 속성을 검색하여 런타임에 내장되어 있습니다. 그러나 최근에 메뉴 항목을 사전 정의 된 방식으로 정렬 해야하는 요청을 받았습니다. 관련 기능이있는 양식은 메뉴에서 서로 옆에 있어야합니다. 이것은 알파벳 분류가 아니라 개발자가 지정한 사전 정의 된 순서입니다.

그러면 문제가 발생합니다. 이러한 속성에서 순서를 어떻게 지정합니까? 하나 이후 MenuItemAttribute 전체 계층 구조를 설명하면 주문 사양에는 계층 구조의 전체 (또는 적어도 일부)에 대한 주문 번호도 포함되어야합니다. 계층 구조의 낮은 수준에 대한 주문 번호로는 충분하지 않습니다.

다른 속성을 만들 수 있습니다. MenuItemOrderHintAttribute, 그러나 그것은 하나 이상의 경우 사례에 문제가 발생할 것입니다. MenuItemAttribute. 따라서 원래 질문입니다.

나는 또한 확장 할 수있다 MenuItemAttribute 두 배열 또는 쌍의 배열을 가져 가지만 구문을 많이 복잡하게 만듭니다. 마지막 아이디어는 내가 현에 특별한 형식을 가질 수 있다는 것입니다. 그러나 그것은 지저분한 IMHO 일 것입니다.


좋아, 또 다른 아이디어가 있습니다. Jon Skeet가 제안한 순서를 사용해 봅시다. 이를 통해 계층 구조의 마지막 레벨이 아닌 순서를 지정할 수 있습니다. 그러나 속성을 수정하여 클래스뿐만 아니라 어셈블리 자체에도 적용 할 수 있습니다. 이 경우 메뉴 항목에는 관련 양식이 없습니다. 어셈블리 수준에서 이러한 속성은 더 높은 수준의 계층 구조 중 순서를 지정하는 데 사용될 수 있습니다.

이것은 중앙 집중식 메뉴 시스템과 분산 메뉴 시스템 간의 트레이드 오프입니다. 이것이 왜 나쁜 생각이 될지 생각합니까?

도움이 되었습니까?

해결책

Menuitemattribute 생성자에 단일 추가 (선택적) 값을 넣었습니다.이 값은 "주문"또는 "우선 순위"입니다.

[MenuItem(0, "Company", "Clients", "Orders")]
[MenuItem(1, "Foo", "Bar", "Baz")]

나는 그것이 예쁘다는 말은 아니지만, 주문을 효과적으로 지정할 수있게 해줄 것입니다.

다른 팁

파일에서 요소의 어휘 주문은 다음과 같습니다 물론 어쨌든 생성 된 CIL 어셈블리에서 유지되는 것이 보장되지 않거나 반사에서 반환 된 결과에서 존중받지 않습니다. 이 주문은 동일한 앱 도메인 내에서 반복 된 호출보다 동일하게 보장되지 않습니다!

MS는 과거에 반사의 다른 부분 에서이 순서를 깨뜨렸다는 점에 유의하십시오. 미래 또는 다른 플랫폼에서.

순서에 의존하지 않고 의미 정보를 직접 표현할 수 있도록 속성 모델을 변경하는 것을 고려하십시오.

불행히도 아니요, 주문이 지정한 순서와 동일하다는 것을 보장 할 수 없습니다.

편집 : 해결 방법

면책 조항 : 궁극적 인 문제를 오해한다면 미리 사과드립니다.

마치 통과 할 수 있어야하는 것처럼 들립니다. n 문자열 수 MenuItemAttribute 그리고 가지고 있습니다 MenuItemAttribute 속성 생성자에서 개발자가 입력 한이 문자열의 순서를 유지하십시오.

가능한 해결책은 다음과 같습니다.

가지다 MenuItemAttribute a LinkedList<String> 상태를 유지합니다. 그런 다음 반복 할 수 있습니다 params String[] 생성자에 추가하십시오 LinkedList<String> 주문을 유지합니다.

당신의 문제는 실제로 양식이 메뉴에 나타나는 위치를 지정한다는 사실에서 비롯된 것 같습니다. 즉, 어셈블리의 모든 양식을 결합하여 메뉴를 만들려고합니다. 메뉴의 구조를 모든 양식과 별도로 지정하고 메뉴 항목에 해당하는 클래스에 정의 된 다양한 속성/속성에서 양식을 해결하면 더 쉬울 수 있습니다.

예를 들어

public class MenuItem
{
    string Text { get; }
    Type FormType { get; }
    ICollection<MenuItem> SubItems { get; }
}

그런 다음 메뉴 항목이 선택되면 어떻게 든 양식을 해결하고 표시하십시오. 이 접근법은 새로운 양식이 필요하다는 단점이 있습니다. 코드가 양식 자체와 함께 메뉴 구조를 지정하는 코드를 변경해야하지만 이는 아주 작은 것입니다 ...

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