2013-06-14 2 views
1

MVC4 웹 응용 프로그램의 VS2012에서 .NET 4.5로 작업합니다. 아직 알 수없는 인수를 허용하는 사용자 지정 특성을 작성하려고합니다.사용자 지정 특성에서 여러 인수를 받아들이는 적절한 방법은 무엇입니까

나는이 다음 코드 :

public sealed class MyCustomAttribute : System.Web.Http.Filters.AuthorizationFilterAttribute 
    { 
     private readonly string[] _someStrings;  

     public MyCustomAttribute(params string[] someStrings) 
     { 
      _someStrings = someStrings; 
     } 
    } 

자연스럽게 나는 다음과 같은 코드 분석 경고 얻을 :

CA1019는 속성 인수에 대한 접근을 정의 공공 추가 읽기 전용 위치에 대한 속성 접근을 'someStrings'인수가 인 경우 'MyCustomAttribute'입니다. 나는 개인 설정과 자동 속성을 정의하는 경우

, 나는

CA1819 등록 리턴해서는 안됩니다 배열이 변경 내가 대신 배열의 컬렉션을 반환해야 경고를 얻을 'MyCustomAttribute.SomeStrings'으로 돌아 가기 콜렉션을 사용하거나 메소드로 변경하십시오.

문제는 아무도 배열 내부의 내용을 변경할 수 없으므로 배열을 노출하고 싶지 않다는 것입니다. 기껏해야 ReadOnlyCollection을 반환하고 싶습니다. 속성의 형식을 'ReadOnlyCollection'으로 변경하면 인수의 이름 (대/소문자 구분 안 함) 및 형식의 속성과 일치하므로 첫 번째 경고가 다시 나타납니다.

질문 : 경고를 표시하지 않고 어떻게이 작업을 수행 할 수 있습니까?

+0

나는 당신이 누군가가 배열 내부의 것을 바꿀 것을 원하지 않는다고 알고 있지만, 속성은 조금 다르게 작동한다고합니다. 속성을 사용할 때 값을 지정할 수 있도록 속성을 공용으로 만듭니 까? 일단 속성을 지정하면 클래스 또는 메소드 내의 코드는 속성을 만질 수 없습니다. –

+0

이제 [MyCustom ("lba", "bla")]을 선언하여 인수를 사용할 수 있습니다. 배열을 공용으로 설정하면 (즉, 내 질문에 두 번째 경고가 표시됨) 리플렉션을 통해 배열을 편집 할 수 있습니다. – Yoeri

+0

나는 공공 재산에 대해서 이야기 할 때 반성을 언급하는 이유를 알지 못한다. 심지어 개인/내부 재산도 반성과 함께 호출 될 수있다. MS 지침에 따르면 : http://msdn.microsoft.com/en-us/library/84c42s56.aspx 특성은 생성자를 사용하여 설정된 필드와 공용 readonly 속성을 모두 갖지 않습니다. 배열을 반환하는 것은 결코 좋은 아이디어가 아닙니다. 어떤 데이터가 속성의 생성자로 전송됩니까? 그러나 배열이 실제로 필요한 경우에는 경고를 표시하는 데 문제가 보이지 않습니다. –

답변

1

이것은 API 사용 편의 규칙이며, 속성을 통해 값을 노출 할 이유가 없으면 경고를 단순히 억제 할 수 있습니다. 값을 노출하려면 ReadOnlyCollection 유형의 속성은 규칙 코드가 규칙 코드를 인식하지 못하더라도 규칙의 의도를 충분하게 충족시킵니다.

+0

그래서 너에 따르면, 방법이 없니? (무례하게 들리지는 않겠지 만 이것은 내 질문에 정말로 답하지 않습니다.) – Yoeri

+1

억제없이 CA1019와 CA1819의 스크리닝 코드를 만족시킬 방법이 없습니다. 그러나 CA1019 규칙이 코딩되는 방식은 그 의도와 비교하여 꽤 "벙어리"입니다.규칙의 목적은 런타임에 속성 외부에서 위치 인수의 내용을 찾을 수있게하는 것입니다 (적절한 경우). ReadOnlyCollection은 의도를 만족시킬 것입니다.하지만 규칙 코드가 마술처럼 이것을 알지 못하기 때문에 억압이 필요합니다. –

관련 문제