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