2010-06-06 28 views
3

Est-il possible d'accéder à une classe parente à partir d'un attribut?Classe parent d'accès à partir d'un attribut personnalisé

Par exemple, je voudrais créer un DropDownListAttribute qui peut être appliquée à une propriété d'une classe viewmodel dans MVC puis créer une liste déroulante à partir d'un modèle de l'éditeur. Je suis une ligne similaire à Kazi Manzur Rashid here.

Il ajoute la collection de catégories dans viewdata et les récupère en utilisant la clé fournie à l'attribut.

Je voudrais faire quelque chose comme ci-dessous,

public ExampleDropDownViewModel { 

    public IEnumerable<SelectListItem> Categories {get;set;} 

    [DropDownList("Categories")] 
    public int CategoryID { get;set; } 
} 

L'attribut prend le nom de la propriété contenant la collection à lier. Je n'arrive pas à comprendre comment accéder à une propriété de la classe parente de l'attribut. Est-ce que quelqu'un sait comment faire ça?

Merci

Répondre

1

Vous ne pouvez pas accéder à un type parent à partir d'un attribut. Les attributs sont des métadonnées qui est appliqué à un type, mais vous ne pouvez pas regarder en arrière et essayer d'identifier le type, à moins que vous avez fait quelque chose comme:

[MyCustomAttribute(typeof(MyClass))] 
public class MyClass { 
    /// 
} 

Avec la solution de réflexion ci-dessus, vous n'êtes pas atteindre réellement l'action d'obtenir un type d'un attribut, vous faites l'inverse, vous obtenez des attributs d'un type. À ce stade, vous avez déjà le type.

1

Vous pouvez le faire en utilisant la réflexion. Procédez comme suit dans votre classe principale:

Type type = typeof(ExampleDropDownViewModel)); 
// Get properties of your data class 
PropertyInfo[] propertyInfo = type.GetProperties(); 

foreach(PropertyInfo prop in propertyInfo) 
{ 
    // Fetch custom attributes applied to a property   
    object[] attributes = prop.GetCustomAttributes(true); 

    foreach (Attribute attribute in attributes) { 
     // we are only interested in DropDownList Attributes.. 
     if (attribute is DropDownListAttribute) { 
    DropDownListAttribute dropdownAttrib = (DropDownListAttribute)attribute; 
     Console.WriteLine("table set in attribute: " + dropdownAttrib.myTable); 
     } 
    } 
} 
+0

Merci pour la réponse. Où irait ce code? Je ne vois pas comment intégrer cela dans le fournisseur de métadonnées proposé par Kazi. De plus, vous ne semblez pas réfléchir sur une instance, alors comment obtiendriez-vous la collection de la propriété Categories. – madcapnmckay

+0

Veuillez noter qu'un attribut personnalisé est un décorateur pour votre objet et que ses informations sont ajoutées aux métadonnées des objets générés par le compilateur. Donc, fondamentalement, lorsque vous décorez une propriété de catégorie avec votre attribut DropDownList, vous pouvez déterminer pendant le rendu du modèle s'il doit être affiché en tant que liste déroulante ou non. –