这是从我的poco中获取真实列名的最佳方法是什么?

时间:2012-01-17 08:48:41

标签: .net petapoco

我正在使用PETAPOCO制作一个通用对象列表,然后绑定到gridview。但是,由于列名称不是有效的属性名称,因此它们会通过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 :(得分:0)

您始终可以使用反射来获取应用于属性的属性,类似于:

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

为了简洁和清晰起见,我省略了错误检查,你应该添加一些以确保它在运行时不会失败。这不是生产质量代码。

同样反射往往很慢,所以最好缓存结果。

答案 1 :(得分:0)

好吧,如果你要做很多事,你可以这样做:

  1. 创建一个所有PetaPoco类将继承的基本界面。
  2. 从继承接口的“SomeTable”创建一个分部类。
  3. 定义允许您提供列名称的​​静态扩展名。这应该在设置时返回定义的“ColumnAttribute”名称,否则返回在类上定义的名称。
  4. 1&amp; 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");