Добавить параметр в существующий 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() ))
    {
    }
}

По крайней мере, он скомпилируется, но из вашего описания не ясно, является ли это жизнеспособным решением.

Другие вопросы по тегам