将参数添加到现有Func

时间:2015-09-04 15:51:19

标签: c# templates inheritance func insight.database

这是一个棘手的问题,我不知道它是否可能。

我们假设我在DLL中有一个Foo1类,但我无法对其进行修改。该课程如下:

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)
    {
    }
}

有可能吗?

修改 我正在使用insight DB。这是一个ORM。有后期处理的功能。代码如下所示:

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
}

通过直接访问阅读器,我们可以在从DB返回后对对象进行一些处理。

1 个答案:

答案 0 :(得分:-1)

Foo1<T1>接受一个包含两个T1参数的函数,并返回IFoo<T1>。我假定Foo1 调用在某些时候起作用。

您想要传递一个函数,该函数需要两个T1参数一个T2参数。问题是 - Foo1知道没有关于T2 - 所以它应该如何知道传递什么?

现在Foo2知道T2,但必须以某种方式将该信息传递给T1。 可以将原始函数映射到参数较少的函数,但它必须有某种解析器知道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() ))
    {
    }
}

它至少会编译,但是如果这是一个可行的解决方案,那么从你的描述中就不清楚了。