在我的C#POCO类上使用自定义属性

时间:2012-06-14 15:59:32

标签: c# asp.net poco

在我的项目中,我有一个名为Area的课程,如下所示。 属性“CodArea”我想放置一个自定义属性,如[NaoSelecionarAttr(true)]。 这工作正常,但是当我创建一个类的实例时,我无法获得此自定义属性。像这样:

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

2 个答案:

答案 0 :(得分:2)

您的代码存在一些问题。

代码中的第一个问题是您在Area上调用默认构造函数,它将_codArea初始化为null。然后,您尝试按照预期在GetType上调用NullReferenceException

第二个问题是你想要一个类属性的属性。所以你必须检查(或反映)类,而不是属性。您会看到,当您编写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”前缀。

  • 我建议您使用“Selecionar”,而不是NaoSelecionar,这是一个负面的属性。这笔交易是你可以很容易地将一个否定句与其相应的正面句混为一谈。从现在起一个月你会问,“好吧,参数是假的,所以我应该选择或不选择这个属性吗?”。 False通常表示NOT,因此,当属性为false时,您的默认解释是不选择某些内容。

  • 您的默认构造函数正在将属性初始化为null。正如我上面所描述的,这可能会导致错误。将其初始化为默认值(string.Empty),或删除默认构造函数,并仅使用需要用户向字符串提供值的构造函数。并且验证这些参数 - 用户可能会再次为字符串提供null。 (首次构建时,对象应该有效)

  • 最后一个提示。您的NaoSelecionar属性获取布尔参数。最后一个子弹就是这个 - 你可以混淆你的属性的真实属性是否意味着“não”或“sim”。那么,为什么不简单地删除参数,然后使用负参数?没有必要将 true false 传递给NaoSelecionar,因为您需要做的就是遍历您的类并找到哪些属性已将此属性应用于它们

答案 1 :(得分:0)

为什么使用areaPoco.CodArea.GetType()?我认为你应该使用areaPoco.GetType()。因为您的自定义属性属于Area类,而不属于字符串。