Добавить параметр в существующий Func
Это немного сложный вопрос, и я не знаю, возможно ли это.
Допустим, у меня есть класс Foo1
это в DLL, и я не могу изменить его. Класс выглядит так:
public class Foo1<T1> : IFoo<T1>
{
public Foo1(Func<IFoo, T1, T1> postRead);
}
Я хочу наследовать Foo1
и быть в состоянии ввести T2
объект в оригинале postRead
и получить доступ к нему в базе postRead
,
Что-то вроде этого:
public class Foo2<T1, T2> : Foo<T1>
{
public Foo2(Func<IFoo, T1, T2, T1> newPostRead)
:base(Func<IFoo, T1, T1> secondPostRead)
{
}
}
Является ли это возможным?
РЕДАКТИРОВАТЬ: я использую понимание базы данных. Это ОРМ. Есть функция, которая делает пост-обработку. Код выглядит так:
public class PostProcessRecordReader<T> : RecordReader<T>
{
public PostProcessRecordReader(Func<IDataReader, T, T> postRead);
}
//How to use the processor
public DummyFunction(ObjectIWantToUse objectIwantToUse)
{
PostProcessRecordReader<Foo> _postProcessorForCubeWithAllEntitiesForBuilding = new PostProcessRecordReader<Foo> (reader, obj) =>
{
//Need to have access objectIwantToUse !!!
//maybe I want to modify obj or add some stuff to it
}
);
//Do some stuff by using _postProcessorForCubeWithAllEntitiesForBuilding
}
Мы можем выполнить некоторую обработку объекта, который был возвращен из БД, напрямую обратившись к считывателю.
1 ответ
Foo1<T1>
принимает функцию, которая имеет два T1
параметры и возвращает IFoo<T1>
, Я предполагаю, что Foo1
вызывает эту функцию в какой-то момент.
Вы хотите передать ему функцию, которая занимает два T1
параметры и T2
параметр. Проблема в - Foo1
ничего не знает о T2
- так как он должен знать, что пройти?
Сейчас Foo2
знает о T2
но должен как-то передать эту информацию Т1. Он может отобразить исходную функцию на функцию с меньшим количеством параметров, но для этого потребуется какой-то распознаватель, который знает, что T2
должно быть:
public class Foo2<T1, T2> : Foo1<T1>
{
public Foo2(Func<IFoo<T1>, T1, T2, T1> newPostRead, Func<T2> resolver)
:base((IFoo<T1> t1a, T1 t1b) => newPostRead(t1a, t1b, resolver() ))
{
}
}
По крайней мере, он скомпилируется, но из вашего описания не ясно, является ли это жизнеспособным решением.