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目的のプロパティを名前で見つけてから、インスタンスからその値を取得できますtab

例については、この質問への回答を参照してください: How can I get the value of a string property via Reflection?

明確化: はい、あなたの型は一般的な引数ですが、typeof(DataBaseTable)使用tab.GetType()されている特定の型を検査することはできます。

于 2012-08-15T01:59:31.980 に答える
0

実行時にプロパティ名しかわからない場合は、リフレクションを使用してください...ただし、これは多くの場合、コードのにおいです。

コンパイル時にプロパティ名がわかっているが具象型がわからない場合 (および .net 4 を使用している場合) は、戻り値を a にキャストし、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
    {
于 2012-08-15T02:24:32.950 に答える