我正在尝试使用系统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