DisplayAttribute name with a variable, Dynamic DisplayName
Asked Answered
G

2

8

Wondering if this is possible or something with this effect.

public class MyModel
{
    public string Name { get; set; }

    [Display(Name = String.Format("This is [0]'s phone number", Name)]
    public string PhoneNumber { get; set; }
}

I'm talking about a DisplayName with a variable in it, non static and possibly based on the models other properties. Is this possible in any way?

Gerdes answered 24/2, 2012 at 17:4 Comment(0)
E
4

This isn't possible because the arguments specified for parameters of attributes must be constant values (instinctively, because there is no context in relation to anything else and not necessarily able to be resolved at compile-time (which is a requirement)). From the C# Specification (3.0) §17.2:

An expression E is an attribute-argument-expression if all of the following statements are true:

  • The type of E is an attribute parameter type (§17.1.3).
  • At compile-time, the value of E can be resolved to one of the following:
    • A constant value.
    • A System.Type object.
    • A one-dimensional array of attribute-argument-expressions.
Estaestablish answered 24/2, 2012 at 17:5 Comment(0)
B
3

For purposes like internationalisation, you can subclass the key attributes like DisplayNameAttribute, DescriptionAttribute and CategoryAttribute, and use some lookup (resx, database, whatever). This works fine and it is easy to find examples.

However, you cannot access values of the object, simply because: an attribute is not given that context!

However, if this is for things like PropertyGrid, DataGridView etc, there is another approach: use either ICustomTypeDescriptor or TypeDescriptionProvider to provide a custom descriptor, which can specify the DisplayName it wants. You can capture the target object/property when you create the instance of the custom descriptor. If you only want to tweak the properties, sometimes TypeConverter can be simpler to implement than ICustomTypeDescriptor/TypeDescriptionProvider, but ultimately both need custom PropertyDescriptor implementations.

This is all quite a bit of work; make sure you're happy with this level of complexity! There is probably a simpler option.

Business answered 24/2, 2012 at 18:6 Comment(1)
could you ellaborate this idea with some code please?Bukharin

© 2022 - 2024 — McMap. All rights reserved.