1

私のプロジェクトには、Area以下のようなクラスが1つあります。プロパティ" CodArea"のようなカスタム属性を1つ入れたい[NaoSelecionarAttr(true)]。これは正常に機能していますが、クラスのインスタンスを1つ作成すると、このカスタム属性を取得できません。このようなもの:

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; }
}
}
4

2 に答える 2

2

コードにいくつかの問題があります。

コードの最初の問題は、 nullAreaに初期化されるデフォルトのコンストラクターを呼び出していることです。_codAreaそして、あなたはGetTypeそれを呼び出そうとしますが、それは予想通り失敗しますNullReferenceException

2番目の問題は、クラスのプロパティの属性が必要なことです。したがって、プロパティではなく、クラスを検査(または反映)する必要があります。ご覧areaPoco.CodArea...のとおり、コンパイラを作成すると、get式の結果(この場合はフィールド)に解決されます_codArea。を呼び出すことによりGetType()_codArea取得するのはStringタイプであり、タイプではありませんArea。これは最初は紛らわしいように思えるかもしれませんが、プロパティは型ではないため、それらを反映することはできません。

したがって、あなたがすべきことは次のとおりです。

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」で作業することをお勧めします。取り決めは、否定的な文とそれに対応する肯定的な文を簡単に混同できるということです。今から1か月後に、「わかりました。パラメータがfalseなので、このプロパティを選択するかどうかを選択する必要がありますか?」と尋ねられます。Falseは通常、NOTを意味します。したがって、デフォルトの解釈では、プロパティがfalseの場合は何かを選択しません。

  • デフォルトのコンストラクターは、プロパティをに初期化していますnull。上で説明したように、これはバグを引き起こす可能性があります。デフォルト値(string.Empty)に初期化するか、デフォルトコンストラクターを削除して、ユーザーが文字列に値を提供する必要があるコンストラクターのみを使用します。また、これらのパラメータも検証します。ユーザーがnull文字列にaを再度指定する場合があります。(オブジェクトは最初に構築されたときに有効である必要があります)

  • 最後のヒント。属性NaoSelecionarはブールパラメータを取得します。最後の箇条書きはまさにそれに関するものでした。属性に真のプロパティがあるということは、「não」と「sim」のどちらを意味するのか混乱する可能性があります。さて、パラメータを削除してから、負のパラメータで作業してみませんにtrueまたはfalseを渡す必要はありませんNaoSelecionar。必要なのは、クラスを反復処理して、この属性が適用されているプロパティを見つけることだけだからです。

于 2012-06-14T16:38:36.900 に答える
0

なぜ使うのareaPoco.CodArea.GetType()?私はあなたが使うべきだと思いますareaPoco.GetType()。カスタム属性は文字列ではなくAreaクラスに属しているためです。

于 2012-06-14T16:26:42.920 に答える