Quelle est la meilleure façon d'obtenir les vrais noms de colonne de mon POCO?

StackOverflow https://stackoverflow.com/questions/8891804

  •  29-10-2019
  •  | 
  •  

Question

J'utilise Petapoco à faire une liste d'objets génériques qui sont ensuite liés à un GridView. Cependant, comme les noms de colonne ne sont pas des noms de propriétés valides, ils obtiennent des modifications par le code T4. Je voudrais parcourir les colonnes GridView et modifier le texte de l'en-tête pour afficher les noms de colonnes réelles. Quelle est la meilleure façon d'obtenir les attributs de colonne d'une propriété POCO lorsque j'ai simplement une représentation de chaîne du nom de la propriété?

Par exemple, j'ai:

[ExplicitColumns]
public partial class SomeTable : DB.Record<SomeTable>  
{

    [Column("5F")] 
    public int _5F 
    { 
        get {return __5F;}
        set {__5F = value;
            MarkColumnModified("5F");}
    }
    int __5F;
}

Je veux une routine comme:

public string GetRealColumn(string ObjectName, sting PropertyName)

De sorte que: getRealColumn ("parfois", "_5f") renvoie "5f"

Aucune suggestion?

Était-ce utile?

La solution

Vous pouvez toujours utiliser la réflexion pour obtenir l'attribut qui est appliqué à la propriété, quelque chose dans le sens de:

public string GetRealColumn(string objectName, string propertyName)
{
   //this can throw if invalid type names are used, or return null of there is no such type
   Type t = Type.GetType(objectName); 
   //this will only find public instance properties, or return null if no such property is found
   PropertyInfo pi = t.GetProperty(propertyName);
   //this returns an array of the applied attributes (will be 0-length if no attributes are applied
   object[] attributes = pi.GetCustomAttributes(typeof(ColumnAttribute));
   ColumnAttribute ca = (ColumnAttribute) attributes[0];
   return ca.Name;
}

Par souci de concision et de clarté, j'ai omis de vérifier les erreurs, vous devez en ajouter pour vous assurer qu'elle n'échoue pas au moment de l'exécution. Ce n'est pas du code de qualité de production.

La réflexion a également tendance à être lente, il est donc préférable de mettre en cache les résultats.

Autres conseils

Eh bien, si vous allez faire beaucoup de choses, vous pourriez faire quelque chose comme ceci:

  1. Créez une interface de base dont toutes vos classes Petapoco hériteront.
  2. Créez une classe partielle à partir de "quelque part" qui hérite de l'interface.
  3. Définissez une extension statique qui vous permet de fournir le nom de la colonne. Cela devrait renvoyer le nom "ColumnAttribute" défini lors du définition, sinon renvoie le nom défini sur la classe.

1 & 2

namespace Example {
    //Used to make sure the extension helper shows when we want it to. This might be a repository....??
        public interface IBaseTable {  }

        //Partial class must exist in the same namespace
        public partial class SomeTable : IBaseTable {    }
    }

3

public static class PetaPocoExtensions {
    public static string ColumnDisplayName(this IBaseTable table, string columnName) {
        var attr = table.GetType().GetProperty(columnName).GetCustomAttributes(typeof(ColumnAttribute), true);
        return (attr != null && attr.Count() > 0) ? ((ColumnAttribute)attr[0]).Name : columnName;
    }
}

Maintenant, vous l'appelez comme tel:

    SomeTable table = new SomeTable();
    var columnName = table.ColumnDisplayName("_5F");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top