【问题标题】:passing child Type through Lembda in Func<Parent, Parent>在 Func<Parent, Parent> 中通过 Lambda 传递子类型
【发布时间】:2020-12-15 15:14:22
【问题描述】:

我有一个这样定义的方法:

 public async Task<Parent> UpdateDataAsync(Func<Parent, Parent> updateExisting)
 {
   return await this.UpdateAsync<Parent>(existing => (updateExisting(existing)));
   
 }

这可以像Parent's Child类这样调用

return await this.UpdateDataAsync(
            chld=>
            {
                return chld.UpdateState(State);
            });

编译器抱怨找不到UpdateStateUpdateStateChild class of Parent 上定义。如何使chld 被传递或推断为Child。我试图在 chld 前面明确说 (Child) 并在不工作的 lembda 之后。

【问题讨论】:

  • 这是一个问题 - “这可以像这样用 Parent's Child 类来调用”
  • 您的问题真的不清楚什么是“父母的孩子班级”? Parent和Child是什么关系?

标签: c# lambda delegates func


【解决方案1】:

我已经阅读了你的问题几次,虽然它仍然不清楚,但我想我明白你的问题了。

我假设 Child 继承自 Parent 对吗?

public class Parent
{
}

public class Child : Parent
{
   public Child UpdateState(State state)
   {
        //whatever this does
        return this;
   }
}

如果我是正确的,请使用此信息更新您的问题。

所以假设上述是正确的,你需要使你的 UpdateDataAsync 方法具有约束的通用性

public async Task<TParent> UpdateDataAsync<TParent>(Func<TParent, TParent> updateExisting)
where TParent : Parent
{
   return await this.UpdateAsync<TParent>(existing => (updateExisting(existing)));   
}

这允许 C# 知道该项目是父项,同时允许您使用子类

这意味着你可以这样做

return await this.UpdateDataAsync<Child>(
    chld=>
    {
        return chld.UpdateState(State);
    });

注意这里的类型参数可能是不需要的,因为编译器可以推断它,但为了清楚起见,我已经包含了它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2018-09-29
    • 1970-01-01
    • 2020-07-24
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多