2 votes

Obtenir des données à partir d'un attribut de propriété

J'ai un modèle de vue qui utilise des attributs personnalisés tels que

public int Id { get; set; }
public string Name { get; set; }
[IsEnumeration(typeof(CaseStatus))]
public string Status { get; set; }

IsEnumeration est un attribut personnalisé qui prend en paramètre une superclasse Enumeration (en fait, il prend n'importe quel type, mais cela n'a pas d'importance puisque personne d'autre ne l'utilisera).

public class IsEnumerationAttribute : Attribute
{
    public Type Enumeration;
    public IsEnumerationAttribute(Type enumeration)
    {
        Enumeration = enumeration;
    }
}

Ce que je veux, c'est pouvoir obtenir le type spécifié pour n'importe quel paramètre. Actuellement, mon code ressemble à ceci :

    public T EnumerationValuesToDisplayNames<T>(T item) where T : new()
    {
        if (LoggedInUser.IsSuper) return item;
        var tProps = typeof (T).GetProperties()
            .Where(prop => Attribute
                 .IsDefined(prop, typeof (IsEnumerationAttribute)));

        foreach (var prop in tProps)
        {
            if (prop.GetValue(item, null) != null)
            {
                /*

    Here I look through all properties with the IsEnumerable attribute.
    I want to do something such as:
                var type = prop.GetAttribute(item, typeof(IsEnumerable));
                var displayName = Enumeration<type>.FromId(prop.GetValue(item, null));
                prop.SetValue(item, displayName);

                */
            }
        }
        return item;
    }

J'espère que cela a du sens, toute aide serait grandement appréciée, merci.

2voto

Bob Vale Points 11355

En supposant, d'après votre message, que vous avez une classe définie comme telle :

public class Enumeration<T> {

  public static string FromId(string id) {
    // FromId Implmentation
  }

}

Dans ce cas, vous n'avez besoin que de

foreach (var prop in tProps) {  
  var id=prop.GetValue(item, null);
  if (id!=null) {  
    var type = prop.GetCustomAttributes(typeof(EnumerationAttribute>,true).OfType<EnumerationAttribute>().Select(x=>x.Enumeration).First();
    var enumerationType=typeof(Enumeration<>).MakeGenericType(type);
    var fromIdMethod=enumerationType.GetMethod("FromId",BindingFlags.Public|BindingFlags.Static|BindingFlags.InvokeMethod);
    var displayName=fromIdMethod.Invoke(null,new object[] {id});
    prop.SetValue(item, displayName);  
  }  
}  

Vous pouvez également implémenter la méthode FromId directement dans l'EnumerationAttribute et l'appeler directement comme suit...

foreach (var prop in tProps) {  
  var id=prop.GetValue(item, null);
  if (id!=null) {  
    var enumAttrib = prop.GetCustomAttributes(typeof(EnumerationAttribute>,true).OfType<EnumerationAttribute>().First();
    var displayName=enumAttrib.FromId((string)id);
    prop.SetValue(item, displayName);  
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X