0

すべてのフィールドを格納するためのリストを取得する必要があります - クラスの値

const string以下に貼り付けたように、クラスはパブリック変数のほんの一部です。

public class HTDB_Cols
{
    public class TblCustomers
    {
        public const string CustID  = "custID",
               Name  = "name",
         CustType  = "custType",
         AddDate  = "addDate",
         Address  = "address",
         City  = "city",
         Phone  = "phone",
         Cell  = "cell";
    }
}

これは、すべてのテーブルの列名を表す文字列のリストを取得できるようにする文字列のリストを返すメソッドですが、エラーが発生するため、このコードでは何かが機能しません

非静的フィールドにはターゲットが必要です」。

public class GetClassFields
{

        public static List<string> AsList(string TableName)
        {


                    return typeof(HTDB_Cols).GetNestedTypes()
                    .First(t => String.Compare(t.Name, TableName, true) == 0)
                    .GetFields()
                    .Select(f => f.GetValue(null) as string)
                    .ToList();

        }
}

次のように使用しようとしています:

foreach (string tblCol in RobCS_212a.Utils.Reflct.GetClassFields.AsList      (DBSchema.HTDB_Tables.TblCustomers))
{
    Response.Write(string.Concat(tblCol, "<br />"));
}

タイプ 'DBSchema.HTDB_Cols+TblTimeCPAReport' で定義されたフィールド 'tbName' は、タイプ 'DBSchema.HTDB_Cols' のターゲット オブジェクトのフィールドではありません。

4

1 に答える 1

1

あなたのコードは近かった。2 つの問題があり、どちらも linq select メソッド呼び出しの引数にありました。

  • クラス HTDB_Cols は非静的クラスであり、取得しようとしている文字列値はインスタンス メンバーです。したがって、クラスからインスタンス メンバーをプルしようとするときは、クラスのインスタンスを FieldInof.GetValue メソッドに渡す必要があります。以下のコードでは、変数「instanceOfClass」にクラスのインスタンスを作成します。これは、 FieldInfo クラスのドキュメントで確認できます。

  • FieldInfo.GetValue から返される値はオブジェクトです。ToString メソッドまたは (文字列) キャストを使用して、明示的に文字列にキャストする必要があります。

これら 2 つの変更により、メソッドが機能します。リストは次のとおりです。

public class GetClassFields
{
    public static List<string> AsList(string tbl)
    {
        var instanceOfClass = new HTDB_Cols();
        return typeof(HTDB_Cols).GetNestedTypes()
                                .First(t => String.Compare(t.Name, tbl, true) == 0)
                                .GetFields()
                                .Select(f => f.GetValue(instanceOfClass).ToString())
                                .ToList<String>();
    }
}

この関数は次のように呼び出すことができます。

var fields = GetClassFields.AsList("TblCustomers");

必要な情報を返します。

ここに画像の説明を入力

于 2012-12-12T02:52:32.057 に答える