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'으로 변경하면 인수의 이름 (대/소문자 구분 안 함) 및 형식의 속성과 일치하므로 첫 번째 경고가 다시 나타납니다.
질문 : 경고를 표시하지 않고 어떻게이 작업을 수행 할 수 있습니까?
나는 당신이 누군가가 배열 내부의 것을 바꿀 것을 원하지 않는다고 알고 있지만, 속성은 조금 다르게 작동한다고합니다. 속성을 사용할 때 값을 지정할 수 있도록 속성을 공용으로 만듭니 까? 일단 속성을 지정하면 클래스 또는 메소드 내의 코드는 속성을 만질 수 없습니다. –
이제 [MyCustom ("lba", "bla")]을 선언하여 인수를 사용할 수 있습니다. 배열을 공용으로 설정하면 (즉, 내 질문에 두 번째 경고가 표시됨) 리플렉션을 통해 배열을 편집 할 수 있습니다. – Yoeri
나는 공공 재산에 대해서 이야기 할 때 반성을 언급하는 이유를 알지 못한다. 심지어 개인/내부 재산도 반성과 함께 호출 될 수있다. MS 지침에 따르면 : http://msdn.microsoft.com/en-us/library/84c42s56.aspx 특성은 생성자를 사용하여 설정된 필드와 공용 readonly 속성을 모두 갖지 않습니다. 배열을 반환하는 것은 결코 좋은 아이디어가 아닙니다. 어떤 데이터가 속성의 생성자로 전송됩니까? 그러나 배열이 실제로 필요한 경우에는 경고를 표시하는 데 문제가 보이지 않습니다. –