ソース名も宛先名もコンパイルタイプで不明な場合は、リフレクションを使用して値の読み取りと設定の両方を行うことができます。
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);
}
明らかに、このようなものを使用するとパフォーマンスが低下します。