¿Cuál es esta la mejor manera de obtener los nombres de columnas reales de mi Poco?

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

  •  29-10-2019
  •  | 
  •  

Pregunta

Estoy usando Petapoco. Sin embargo, dado que los nombres de la columna no son nombres de propiedades válidas, obtienen cambios por el código T4. Me gustaría recorrer las columnas de GridView y cambiar el texto del encabezado para mostrar los nombres de la columna real. ¿Cuál es la mejor manera de obtener los atributos de la columna de una propiedad POCO cuando simplemente tengo una representación de cadena del nombre de la propiedad?

Por ejemplo, tengo:

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

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

Quiero una rutina como:

public string GetRealColumn(string ObjectName, sting PropertyName)

Para que: GetRealColumn ("ATIGHTABLE", "_5F") Devuelve "5f"

¿Alguna sugerencia?

¿Fue útil?

Solución

Siempre puede usar la reflexión para obtener el atributo que se aplica a la propiedad, algo en la línea 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;
}

En aras de la brevedad y la claridad que he omitido la verificación de errores, debe agregar algunos para asegurarse de que no falle en el tiempo de ejecución. Este no es código de calidad de producción.

También la reflexión tiende a ser lenta, por lo que es mejor almacenar en caché los resultados.

Otros consejos

Bueno, si vas a hacer esto mucho, podrías hacer algo como esto:

  1. Cree una interfaz base de la que se heredarán todas sus clases de Petapoco.
  2. Cree una clase parcial de "A veces" que hereda la interfaz.
  3. Defina una extensión estática que le permita suministrar el nombre de la columna. Esto debería devolver el nombre definido de "columnAttribute" cuando se establece, de lo contrario, devuelva el nombre definido en la clase.

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;
    }
}

Ahora, lo llamas así:

    SomeTable table = new SomeTable();
    var columnName = table.ColumnDisplayName("_5F");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top