C# add custom attributes for a parent's property in an inherited class

Vinzz picture Vinzz · Mar 1, 2010 · Viewed 11.3k times · Source

I'm displaying Business Object in generic DataGrids, and I want to set the column header through a custom attribute, like:

class TestBo
 {
    [Header("NoDisp")]
    public int ID {get; set;}

    [Header("Object's name")]
    public String Name { get; set; }
}

So far, so good, but I'd also want to separate my display from my data, by inheritance:

class TestBO
{
   public int ID {get; set;}
   public String Name { get; set; }
}

class TestPresentationBO : TestBO
{
  //Question: how to simply set the Header attribute on the different properties?
}

I see a solution via reflection with a SetCustomAttribute in the Child constructor, but it will be cumbersome, so is there a simple and elegant trick for this problem?

Please prevent me from breaking the data/presentation separation ;o)

Answer

Roman Starkov picture Roman Starkov · Mar 1, 2010

Question: how to simply set the Header attribute on the different properties?

There is no way to set an attribute on an inherited member the way you have suggested, since attributes are specific to a type. SetCustomAttribute won't help you - it's only any good when you construct new types at runtime. Once an attribute has been compiled in you cannot change it at runtime, since it's part of the metadata.

If you want to maintain the separation you will have to find another way.

(You could make the properties virtual, override them in the Presentation class and add attributes on the overrides, but this looks dodgy and doesn't really separate anything - you end up with a complete TestBO class in your TestPresentationBO anyway...)