2012-06-14 8 views
1

내 프로젝트에는 아래처럼 Area이라는 클래스가 있습니다. 속성 "CodArea"[NaoSelecionarAttr(true)]과 같은 사용자 지정 특성을 하나 넣고 싶습니다. 이 잘 작동하지만 클래스의 한 인스턴스를 만들 때이 사용자 지정 특성을 가져올 수 없습니다. 다음과 같이 입력하십시오 :C# POCO 클래스의 사용자 지정 특성 사용

Area areaPoco = new Area(); 
areaPoco.CodArea.GetType().GetCustomAttributes(typeof(NaoSelecionarAttr),true).ToList(); 

[Serializable] 
public class Area 
{ 
    #region Private Members  
    private decimal _numChave; 
    private string _codArea; 

    public Area() 
    { 
     _numChave = 0; 
     _codArea = null; 
    } 

    public Area(decimal pNumChave,  string pCodArea) 
    { 
     NumChave = pNumChave; 
     CodArea = pCodArea; 
    } 
    public virtual decimal NumChave 
    { get { return _numChave;} 
     set { _numChave = value;} 
    } 

    [NaoSelecionarAttr(true)] 
    public virtual string CodArea 
    { 
      get { return _codArea; } 
      set { _codArea = value;} 
    } 
} 

public class NaoSelecionarAttr : Attribute 
{ 
    public bool NaoSelecionar { get; set; } 
    public NaoSelecionarAttr(bool pSim) { this.NaoSelecionar = pSim; } 
} 
} 
+0

이것은 컴파일되지 않습니다 :'areaPoco.CodArea..GetCustomAttributes()'. 컴파일하는 것을 시도 했습니까? –

+0

나는 그것을 여기 잘못 썼다. 내 코드가 copiling됩니다. – Fabio

+0

코드 Fabio를 업데이트하여 현재 시도하고있는 것을 알 수 있도록하십시오. –

답변

2

코드에 몇 가지 문제가 있습니다.

코드의 첫 번째 문제는 Area에 기본 생성자를 호출하여 _codArea을 null로 초기화한다는 것입니다. 그런 다음 GetType을 호출하려고하는데 예상대로 NullReferenceException으로 실패합니다.

두 번째 문제는 클래스 속성의 특성을 원한다는 것입니다. 따라서 당신은 클래스가 아닌 속성을 검사 (또는 반영)해야합니다. 컴파일러는 areaPoco.CodArea...을 쓸 때 컴파일러가 get 표현식의 결과 (이 경우에는 _codArea)로 해석합니다. GetType()_codArea에 전화하면 검색 한 내용이 이 아닌 String 유형입니다. 처음에는 이것이 혼란스럽게 느껴질 수도 있지만 속성은 유형이 아니므로 속성을 반영 할 수 없습니다.

당신이 무엇을해야, 다음입니다 :

  • 귀하의 표기법을 비를 위해 : 나는 수도 경우

    Area areaPoco = new Area(); 
    NaoSelecionarAttr attr = (NaoSelecionarAttr) (areaPoco.GetType().GetProperties().Single(p => p.Name == "CodArea").GetCustomAttributes(typeof(NaoSelecionarAttr), true).Single()); 
    bool naoSelecionar = attr.NaoSelecionar; 
    

    , 나는뿐만 아니라 몇 가지 팁을 제공하고자 기본 생성자는 C/C++를 생각 나게합니다. 일반적으로 매개 변수에 "p"접두어를 붙여야하는 좋은 이유는 없습니다.

  • 부정적인 속성 인 NaoSelecionar 대신 "Selecionar"로 작업하는 것이 좋습니다. 거래는 부정적인 문장을 해당 긍정적 인 문장과 쉽게 혼동 할 수 있다는 것입니다. 지금부터 한 달 후에 "매개 변수가 false이므로이 속성을 선택해야합니까?"라고 묻습니다. False는 일반적으로 NOT을 의미하므로, 속성이 거짓 일 때 기본 해석은 무언가를 선택하지 않는 것입니다.

  • 기본 생성자가 속성을 null으로 초기화하고 있습니다. 위에서 설명한대로 버그가 발생할 수 있습니다. 이 값을 기본값 (string.Empty)으로 초기화하거나 기본 생성자를 제거하고 사용자가 문자열에 값을 제공해야하는 값만 사용하십시오. 그리고 의 매개 변수를 확인하십시오. 사용자는 null을 문자열에 다시 제공 할 수 있습니다. (객체는 처음 생성 될 때 유효해야합니다)

  • 마지막 팁 하나. NaoSelecionar 속성은 부울 매개 변수를 가져옵니다. 마지막 글 머리 기호는 정확히 그 것입니다. 속성에 대한 실제 속성을 갖는 것이 "não"또는 "sim"을 의미하는지 혼동 할 수 있습니다. 자, 단순히 매개 변수를 제거하고 을 입력하고을 음수 매개 변수로 사용할 수 있습니까?사실 또는 거짓 ~ NaoSelecionar을 전달할 필요가 없습니다. 클래스를 반복하고 속성에 적용된 속성을 찾으려면해야합니다.

+0

실제로, 나는 이것을 할 올바른 방법을 모르지만, 내가 원하는 것을 알고 있습니다 :). 예를 들면 다음과 같습니다. Area areaPoco = new Area(); if (areaPoco.CodArea.NaoSelecionar == true) do something – Fabio

+0

@Fabio, 나는 당신이 원하는 것을 얻을 수 있도록 충분한 정보를 추가했습니다. –

+0

감사합니다 브루노, 도와 주셔서 감사합니다 ... – Fabio

0

areaPoco.CodArea.GetType()을 사용합니까? 제 생각에는 areaPoco.GetType()을 사용해야합니다. 사용자 정의 속성이 문자열이 아닌 Area 클래스에 속하기 때문입니다.

+0

사실, 나는 이것을 할 올바른 방법을 모르지만, 내가 원하는 것을 알고 있습니다. :) 예를 들면 다음과 같습니다. Area areaPoco = new Area(); if (areaPoco.CodArea.NaoSelecionar == true) something do – Fabio

관련 문제