Я создаю скомпилированные методы получения во время выполнения для данного члена. Прямо сейчас мой код просто предполагает, что результатом метода получения является строка (хорошо сработало для тестирования). Тем не менее, я хотел бы, чтобы это работало с помощью пользовательского класса преобразователя, который я написал, см. ниже ссылку «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();
}
Ищу, что поместить во вторую область TODO (с первой справлюсь :)).
Полученная скомпилированная лямбда должна принимать экземпляр типа U в качестве параметра, вызывать указанную функцию доступа к члену, затем вызывать метод преобразователя «FieldToString» с результатом и возвращать результирующую строку.