Что это лучший способ получить настоящие имена столбцов из моего poco? - PullRequest
0 голосов
/ 17 января 2012

Я использую PETAPOCO для составления списка общих объектов, которые затем привязываются к сетке.Однако, поскольку имена столбцов не являются допустимыми именами свойств, они получают изменения с помощью кода T4.Я хотел бы перебрать столбцы gridview и изменить текст заголовка, чтобы показать реальные имена столбцов.Каков наилучший способ получить атрибуты столбца свойства POCO, когда у меня просто есть строковое представление имени свойства?

Например, у меня есть:

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

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

Я хочуподпрограмма типа:

public string GetRealColumn(string ObjectName, sting PropertyName)

Так что: GetRealColumn ("SomeTable", "_5F") возвращает "5F"

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2012

Ну, если вы собираетесь делать это много, вы можете сделать что-то вроде этого:

  1. Создайте базовый интерфейс, от которого будут наследоваться все ваши классы PetaPoco.
  2. Создайте частичный класс из «SomeTable», который наследует интерфейс.
  3. Определите статическое расширение, которое позволяет вам указывать имя столбца.Это должно вернуть определенное имя «ColumnAttribute», когда оно установлено, иначе вернет имя, определенное в классе.

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

Теперь вы называете это так:

    SomeTable table = new SomeTable();
    var columnName = table.ColumnDisplayName("_5F");
0 голосов
/ 17 января 2012

Вы всегда можете использовать отражение, чтобы получить атрибут, который применяется к свойству, что-то вроде:

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

Для краткости и ясности я пропустил проверку ошибок, вы должны добавитьнекоторые, чтобы гарантировать, что это не терпит неудачу во время выполнения.Это не код качества производства.

Кроме того, рефлексия имеет тенденцию быть медленной, поэтому лучше кэшировать результаты.

...