#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 здесь, вероятно, не нужен, поскольку компилятор может вывести его, но я включил его для ясности