簡體   English   中英

使用lambda通過System.Reflection提取成員信息

[英]using lambda to extract member info via 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”,因此這就是我可以通過自定義“ index”而不是其數據庫名稱引用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM