I don't think it's possible but since I haven't got a definite clarity from MSDN, I feel that it's best to ask. Suppose that we have a class as follows.
public partial class Hazaa
{
public int Shazoo { get; set; }
}
Then, I'd like Shazoo to be attributed as SuperCool but I wish to do so in another file. Since I'm using partial classes, I can add new properties as follows.
public partial class Hazaa
{
[SuperCool]
public int Wheee { get; set; }
}
But can I attribute a property declared in the first sample by writing code in the latter? I doubt it's possible but I'll be glad to stand corrected. If so, what's the syntax?
Based on your requirements, as an option you can consider using:
MetadataType
attributeThe attributes that you can register this way are not really your class attributes, but most frameworks use them like your class native attributes.
If you want to add data annotations attributes, specially in as
ASP.NET MVC
project, you will find this way helpful.Also for other frameworks like
Windows Forms
that don't supportMetadataTypeAttribute
you can simply add support usingAssociatedMetadataTypeTypeDescriptionProvider
.The solution is not restricted to data annotations attributes and you can use all kind of attributes that are meaningful for your libraries and frameworks.
How to define additional attributes?
You can create a metadata class that contains properties of your original class decorated by suitable attributes and then decorate the partial class by
MetadataType
attribute and introduce the metadata class for your original class.How to see the impact of those attributes?
Frameworks like
ASP.NET MVC
use those attributes like they are defined in your original class.Also You can register
AssociatedMetadataTypeTypeDescriptionProvider
as provider for your original type for other frameworks or components that may want to useTypeDescriptor
to get information about your type.Are they really my class attributes?
Please pay attention, this way, the attributes really don't belong to your original class, but for most frameworks, like
ASP.NET MVC
orWindows Forms
that useTypeDescriptor
to get information about types, they act like your class original attributes.So if you want to get attributes for a property using reflection, you can't see them, but if you you use
TypeDescriptor
mechanism, you can see them.An Example
Hazaa Class:
HazaaMetadata Class
ASP.NET MVC Usage
you don't need to do anything else to make that
DisplayName
work, you can simply useHtml.Labelfor
orHtml.DisplayNameForm
to see the impact. It will show "Shazoo Name" as label text.Windows Forms Usage
Some where in your application (like form load, main, ...) register the provider this way:
And as a result, you will see
PropertyGrid
andDataGridView
use "Shazoo Name" as caption for property and column title.of course you can do it using Metadata as follow:
No, you can't.
You can only attach attributes to members you declare there and then, and unless the member is also declared as partial (so that you may reimplement it elsewhere) you cannot attach attributes to members declared in another partial file.