c# - 如何从实例化泛型类中获取属性?

时间:2012-08-15 01:45:47

标签: c# database linq generics

从之前的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);
    }

2 个答案:

答案 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
    {