我正在使用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”
有什么建议吗?
答案 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&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");