передача дочернего типа через Lembda в Func

#c# #lambda #delegates #func

#c# #лямбда #делегирует #функция

Вопрос:

У меня есть метод, определенный следующим образом:

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

Это может быть вызвано следующим образом с родительским дочерним классом

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

Компилятор жалуется на невозможность поиска UpdateState .
UpdateState определяется на Child class of Parent . Как я могу сделать так, чтобы chld передавалось или выводилось как Child . Я пытался явно сказать (Child) перед chld и после lembda, что это не работает.

Комментарии:

1. Это вопрос — «Это может быть вызвано подобным образом с родительским дочерним классом»

2. Ваш вопрос действительно не ясен, что такое «родительский дочерний класс»? какова связь между родительским и дочерним?

Ответ №1:

Я прочитал ваш вопрос пару раз, и хотя он все еще не ясен, я думаю, что я понял, о чем вы спрашиваете.

Я предполагаю, что дочерний тип наследуется от родительского права?

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

ПРИМЕЧАНИЕ. параметр type здесь, вероятно, не нужен, поскольку компилятор может вывести его, но я включил его для ясности