0

在上一个线程中,我询问了如何以通用方式从 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);
    }
4

2 回答 2

0

如果您的属性名称仅在运行时已知,那么您可以使用反射来检查 type DataBaseTable,通过名称找到感兴趣的属性,然后从您的 instance 中检索其值tab

有关示例,请参阅此问题的答案:如何通过反射获取字符串属性的值?

澄清:是的,您的类型是一个通用参数,但typeof(DataBaseTable)ortab.GetType()仍然允许您检查正在使用的特定类型。

于 2012-08-15T01:59:31.980 回答
0

如果您只在运行时知道属性名称,请使用反射……尽管这通常是一种代码味道。

如果您在编译时知道属性名称但不知道具体类型(并且正在使用.net 4),则将返回值转换为 adynamic并正常访问该属性。

如果您在编译时知道具体的类型和属性,则将返回值转换为返回的类型并正常访问该属性。

还基于提供的片段,您的代码可能应该是

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
    {
于 2012-08-15T02:24:32.950 回答