W pewnym metody klasy A, muszę wywołać metodę biblioteki B, która przyjmuje jako IProgress<Object>
jako parametr.C# Czy jest możliwe podanie lambda, gdy wymagany jest interfejs?
Zwykle mogę wprowadzić IProgress<Object>
jako część klasy, w której A rezyduje, a następnie przekazać "to" do metody B. A może mogę utworzyć nową klasę, której jedynym celem jest implementacja IProgress<Object>
i poprawne jej przetwarzanie-- wtedy w tym przypadku utworzę instancję tej klasy i przekażę ją B.
Ale tak naprawdę chcę, aby moja implementacja IProgress<Object>
pojawiła się bezpośrednio w metodzie, w której dzwonię B, więc że istnieje mniej wizualnego rozłączenia między kodem wywołującym a implementacją IProgress<Object>
. (Uważam, że moja implementacja IProgress jest rodzajem prywatnego, niewspółużytkowanego szczegółu metody wywoływania, a tym samym nie chcę, aby moja implementacja IProgress<Object>
była w osobnej metodzie prawdopodobnie całej innej klasy).
Co Próbowałem zrobić to użyć lambda, w którym będę definiować mój krótki postęp przenoszenia, a następnie w jakiś sposób przekazać tę lambda do B, jak to:
method in class A {
...
Action<Object> Report = (m) => { // do something useful with m };
B(Report)
}
method B(IProgress<Object> reporter) {
reporter.Report(some object)
}
Oczywiście, wiem dlaczego to nie zadziała tak jak jest - B chce, aby obiekt implementował IProgress<Object>
, a zamiast tego wręczam mu obiekt Akcji.
Czy istnieje jakiś sposób, aby osiągnąć to, co staram się osiągnąć? (IE mam wdrożenie jeśli IProgress<Object>
pojawiają się wewnątrz metody A?
C# lambda są anonimowe delegaci . Potrzebny jest anonimowy typ, który implementuje interfejs. Zobacz [to pytanie] (http://stackoverflow.com/questions/191013/can-a-c-sharp-anonymous-class-implement-an-interface) dla niektórych obejść nad anonimowymi typami tylko własności publicznej, które zapewnia C#. –