1

カスタム クラス プロパティのセットがあります。各プロパティには、データベース内の値と同じ名前が付けられています。私がやりたいことは、スイッチに基づいて各プロパティの値を動的に設定することです。

カスタム プロパティは次のようになります。

    class MyDEF
{

    #region Variable Declaration Section....

    private string _ABC01;
    private string _ABC02;
    private string _ABC03;
    private string _ABC04;

     #endregion 

    #region Property Declaration Section

    public string ABC01
    {
        get { return _ABC01; }
        set { _ABC01= value; }
    }

    public string ABC02
    {
        get { return _ABC02; }
        set { _ABC02= value; }
    }

    public string ABC03
    {
        get { return _ABC03; }
        set { _ABC03= value; }
    }

    public string ABC04
    {
        get { return _ABC04; }
        set { _ABC04= value; }
    }

   #endregion
 }

次に、値をロードするコードは次のようになります。

    foreach (DataRow dr in dataTable.Rows)
            {
                ED = dr["FieldDesc"].ToString();

     switch (ED)
     {
                            case "ABC01":
                                ratesVO.ABC01 = dr["DefaultValue"].ToString();
                                break;
                            case "ABC02":
                                ratesVO.ABC02 = dr["DefaultValue"].ToString();
                                break;
                            case "ABC03":
                                ratesVO.ABC03 = dr["DefaultValue"].ToString();
                                break;
                            case "ABC04":
                                ratesVO.ABC04 = dr["DefaultValue"].ToString();
                                break;
     }
    }

私が達成したいのは次のようなものです:

    foreach (DataRow dr in dataTable.Rows)
    {
                ED = dr["FieldDesc"].ToString();
                MyCustomProperty.ED = dr["DefaultValue"].ToString();
    }

これは可能ですか?もしそうなら、例または参照を提供してください。

4

3 に答える 3

1

あなたが話しているのは基本的にリフレクションです。ここで(簡略化):

string propertyName = (string)dr["FieldDesc"];
object value = dr["DefaultValue"];
// assign
obj.GetType().GetProperty(propertyName).SetValue(obj, value, null);

ただし、リフレクションはパフォーマンスに影響を与えます。控えめに使用しても問題ありませんが、データ アクセス ループの一部として、これは本当に害を及ぼす可能性があります。このパフォーマンスを大幅に向上させるために、FastMemberなどのライブラリ サポートを使用することを検討してください。

var wrapped = ObjectWrapper.Create(obj);
...
wrapped[propertyName] = value;

DataTableただし、オブジェクト モデルにプッシュするためだけに にロードする価値はほとんどないと思います。データ リーダー API から直接作業することもできます。

于 2012-10-10T06:03:13.747 に答える
1

Reflectionを使用して、プロパティ名に基づいて動的に値を設定できます。

foreach (DataRow dr in dataTable.Rows)
{
    ED = dr["FieldDesc"].ToString();
    ratesVO.GetType().GetProperty(ED)
                     .SetValue(ratesVO, dr["DefaultValue"].ToString());
}
于 2012-10-10T06:00:26.573 に答える
0

あなたができることは、このようにデータテーブルで選択を実行することです。(ただし、これは完全なコードではありません。修正が必要になる場合があります。)

DataRow[] result = table.Select("FieldDesc='<Required property>'");
        return result[0]["DefaultValue"]
于 2012-10-10T06:02:35.203 に答える