特定のメンバーに対して実行時にコンパイル済みの getter メソッドを生成しています。今のところ、私のコードは getter メソッドの結果が文字列であると想定しています (テストではうまくいきました)。ただし、私が作成したカスタム コンバーター クラスでこれを機能させたいと考えています。以下を参照してください。追加した「ConverterBase」リファレンスを参照してください。
コンバーター クラスへの呼び出しを式ツリーに追加する方法がわかりません。
public Func<U, string> GetGetter<U>(MemberInfo info)
{
Type t = null;
if (info is PropertyInfo)
{
t = ((PropertyInfo)info).PropertyType;
}
else if (info is FieldInfo)
{
t = ((FieldInfo)info).FieldType;
}
else
{
throw new Exception("Unknown member type");
}
//TODO, replace with ability to specify in custom attribute
ConverterBase typeConverter = new ConverterBase();
ParameterExpression target = Expression.Parameter(typeof(U), "target");
MemberExpression memberAccess = Expression.MakeMemberAccess(target, info);
//TODO here, make the expression call "typeConverter.FieldToString(fieldValue)"
LambdaExpression getter = Expression.Lambda(memberAccess, target);
return (Func<U, string>)getter.Compile();
}
2 番目の TODO エリアに何を入れるかを探しています (最初の TODO エリアは処理できます:))。
結果のコンパイル済みラムダは、型 U のインスタンスをパラメーターとして取り、指定されたメンバー アクセス関数を呼び出してから、コンバーターの "FieldToString" メソッドを結果と共に呼び出し、結果の文字列を返す必要があります。