使用 lambda 通过 System.Reflection 提取成员信息



我正在尝试使用系统Reflection来启用类member的提取(类型 int

var CurrTblID = typeof(currProjData).GetMembers(
                                  BindingFlags.Public |BindingFlags.Static
                                 ).Select(t => t.Name)...what expresssion should I put here?

这将公开一个enumerator,接口iEnumerable并将其分配给CurrTblID

所以我可以使用foreach循环,找出哪个"表 ID"Tid是当前的

  • 如何在没有foreach的情况下访问特定的字段名称并找出其值?

问题的来源在currProjData类中,如下所示。

如果需要答案,一些背景:

在此代码中,我使用了一个结构,可以设置数据库表Sql server提供详细信息供以后使用。

我在SQL Server中找不到答案,所以我做了一个用于保存自定义index的结构 - 作为我将在我的应用程序中使用的每个表的数字ID

            public class DBMetaDetails
            {
                public struct DbTable
                {
                    public DbTable(string tableName, int tableId): this()
                    {
                        this.TableName = tableName;
                        this.TableID = tableId;
                    }
                    public string TableName { get;  set; }
                    public int TableID { get;  set; }
                }
            }

TableID是我通过该结构使用的自定义数字"id",所以这就是我如何通过自定义"索引"而不是它的数据库名称来引用SQL table

public static class currProjData 
{
    static DBMetaDetails.DbTable CustomersMeta = new DBMetaDetails.DbTable();
    static DBMetaDetails.DbTable TimesMeta = new DBMetaDetails.DbTable();
    public static void SetTablesMetaDetails()
    {
        TimesMeta.TableID = HTtIDs.TblTimes;
        TimesMeta.TableName = HTDB_Tables.TblTimes;
        CustomersMeta.TableID = HTtIDs.TblCustomers;
        CustomersMeta.TableName = HTDB_Tables.TblTimeCPAReport;
    }
    public static readonly int CustomersTid = CustomersMeta.TableID;
    public static readonly string CustomersTblName = CustomersMeta.TableName;
    public static readonly int TimesTid = TimesMeta.TableID;
    public static readonly string TimesTblName = TimesMeta.TableName;
}

如何在没有foreach的情况下访问特定的字段名称并找出其值?

创建一个通用扩展方法,它将处理任何对象,然后在内部执行 FirstOrDefault:

public static int ExtractIntProperty<T>( this T targetItem, string propertyName )
{
   int result = 0;
   var prop = targetItem.GetType()
                        .GetProperties()
                        .FirstOrDefault( prp => prp.Name == propertyName );

   if (prop != null)
   {
      var val = prop.GetValue( targetItem, null );
      if (val != null)
         result = (int) val;
   }
   return result;
}

然后获取这样的值(强制转换以显示它处理未知对象)

object detail = (object) new DBMetaDetails.DbTable() { TableName = "Jabberwocky", TableID = 12 };
Console.WriteLine ( detail.ExtractIntProperty("TableID") ); // 12

最新更新