【问题标题】:Add a parameter to an existing Func将参数添加到现有 Func
【发布时间】:2015-09-04 15:51:18
【问题描述】:

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

假设我有一个类Foo1,它在一个DLL 中,我不能修改它。该类如下所示:

public class Foo1<T1> : IFoo<T1>
{
    public Foo1(Func<IFoo, T1, T1> postRead);
}

我想继承Foo1 并能够在原始postRead 中注入T2 对象并在基础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
}

我们可以通过直接访问读取器对从数据库返回的对象进行一些处理。

【问题讨论】:

  • 很难知道你想用额外的参数做什么......你能举一个具体的例子吗?
  • 答案可能是肯定的,但您需要提供一条额外的信息:新引入的T2 会发生什么?
  • 请提供实际编译的代码
  • 我编辑了我的问题。

标签: c# templates inheritance func insight.database


【解决方案1】:

Foo1&lt;T1&gt; 接受一个有两个T1 参数的函数并返回一个IFoo&lt;T1&gt;。我推测Foo1 调用 在某些时候该函数。

您想向它传递一个带有两个T1 参数的函数一个T2 参数。问题是 - Foo1T2 了解一无所知 - 那么它应该如何知道传递什么?

现在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() ))
    {
    }
}

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

【讨论】:

  • 实际上 Foo1 带一个阅读器和 T1 并返回 T1。我想让基类知道 T2,所以我可以使用它,就像我在编辑的问题中显示的那样。
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 2018-06-03
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多