0

クライアント ポストバックから、「フィールド名」と「値」に一致する 2 つの変数を受け取りました。フィールド名は、db テーブル列内にある 50 個のフィールドの 1 つです。

リフレクションを使用して、どのポストバック フィールド名がテーブル内のフィールドと一致するかを特定し、LINQ update を使用して返された値でその単一のフィールドを更新するにはどうすればよいですか?

(string fieldid, string fieldvalue)

更新: LINQ 結果セットで列の値 を動的に選択して更新するを見てきました

ページに特定の TExtBox を設定する代わりに、反映された変数フィールドの値をデータベースに書き戻す必要がありますか? これは私がもっと学びたいと思っているところです。

4

1 に答える 1

1

ソース名も宛先名もコンパイルタイプで不明な場合は、リフレクションを使用して値の読み取りと設定の両方を行うことができます。

public void SetField<T1, T2>(T1 destination, string destinationFieldName, 
                             T2 source     , string sourceFieldName)
{  
    FieldInfo destFi    = typeof(T1).GetField(destinationFieldName);
    FieldInfo sourceFi  = typeof(T2).GetField(sourceFieldName);

    if (sourceFi != null && destFi != null)
        destFi.SetValue(destination, sourceFi.GetValue(source));
}

次に、NewName というフィールドを設定 (Settings というクラスのインスタンス) からタイプ Table1 のレコードの列名にコピーしようとしている場合は、次のことができます。

SetField<Table1, Settings<(record , "Name" , settings , "NewName");

フィールドではなくプロパティを使用している場合は、FieldInfo ではなく PropertyInfo を使用する必要があります。

public void SetProperty<T1, T2>(T1 destination, string destinationFieldName, 
                                T2 source, string sourceFieldName)
{
    PropertyInfo destPi     = typeof(T1).GetProperty(destinationFieldName);
    PropertyInfo sourcePi  = typeof(T2).GetProperty(sourceFieldName);

    if (sourcePi != null && destPi != null)
        destPi.SetValue(destination, sourcePi.GetValue(source , null) , null);
}

明らかに、このようなものを使用するとパフォーマンスが低下します。

于 2012-08-23T22:06:05.220 に答える