从之前的thread我问过如何以通用方式从id获取注册表,我得到的答案是:
public class DBAccess
{
public virtual DataBaseTable GetById<DataBaseTable>(int id, Table<DataBaseTable> table) where DataBaseTable : class
{
var itemParameter = Expression.Parameter(typeof(DataBaseTable), "item");
var whereExpression = Expression.Lambda<Func<DataBaseTable, bool>>
(
Expression.Equal(
Expression.Property(
itemParameter,
"Id"
),
Expression.Constant(id)
),
new[] { itemParameter }
);
return table.Where(whereExpression).Single();
}
}
哪个很好用,但是现在我不知道如何获得它的任何属性,给出一个具体的问题,我怎么能让这个功能起作用呢?
public static int GetRelatedTableId<DataBaseTable>
(Table<DataBaseTable> table,String RelatedTableId) where DataBaseTable : class
{
DBAccess RegistryGet = new DBAccess();
DataBaseTable tab = RegistryGet.GetById<DataBaseTable>(id, table);
return tab.getAttributeByString(RelatedTableId);//i just made this up
}
更新解决方案
感谢下面的链接,我设法解决了这个问题
public static int GetRelatedTableId<DataBaseTable>
(Table<DataBaseTable> table,String RelatedTableId) where DataBaseTable : class
{
DBAccess RegistryGet = new DBAccess();
DataBaseTable tab = RegistryGet.GetById<DataBaseTable>(id, table);
return (int)(tab.GetType().GetProperty(RelatedTableId)).GetValue(tab, null);
}
答案 0 :(得分:0)
如果您的属性名称仅在运行时已知,则可以使用反射来检查类型DataBaseTable
,按名称查找感兴趣的属性,然后从实例tab
中检索其值。
请参阅此问题的答案以获取示例:How can I get the value of a string property via Reflection?
澄清:是的,您的类型是一般参数,但typeof(DataBaseTable)
或tab.GetType()
仍允许您检查所使用的特定类型。
答案 1 :(得分:0)
如果您在运行时只知道属性名称,请使用反射...虽然这通常是代码味道。
如果您在编译时知道属性名称而不知道具体类型(并使用.net 4),则将返回值强制转换为dynamic
并正常访问该属性。
如果您在编译时知道具体类型和属性,则将返回值强制转换为返回的类型并正常访问该属性。
也基于提供的片段,您的代码应该是
public class DBAccess<T> where T : class
{
public virtual T GetById(int id, Table<T> table)
{
或
public static class DBAccess
{
public static T GetById<T>(int id, Table<T> table) where T : class
{