Czy istnieje konstrukt w języku C#, który umożliwia tworzenie anonimowej klasy implementującej interfejs, tak jak w Javie?Interfejs implementujący anonimową klasę w języku C#?
Odpowiedz
Jak już stwierdzono, nie, nie jest to możliwe. Można jednak utworzyć klasę, która implementuje żądany interfejs i akceptuje lambda w jego konstruktorze, dzięki czemu można przekształcić lambdę w klasę implementującą interfejs. Przykład:
public class LambdaComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> _lambdaComparer;
private readonly Func<T, int> _lambdaHash;
public LambdaComparer(Func<T, T, bool> lambdaComparer) :
this(lambdaComparer, EqualityComparer<T>.Default.GetHashCode)
{
}
public LambdaComparer(Func<T, T, bool> lambdaComparer,
Func<T, int> lambdaHash)
{
if (lambdaComparer == null)
throw new ArgumentNullException("lambdaComparer");
if (lambdaHash == null)
throw new ArgumentNullException("lambdaHash");
_lambdaComparer = lambdaComparer;
_lambdaHash = lambdaHash;
}
public bool Equals(T x, T y)
{
return _lambdaComparer(x, y);
}
public int GetHashCode(T obj)
{
return _lambdaHash(obj);
}
}
użycia (oczywiście nic nie robi pomocny, ale masz pomysł)
var list = new List<string>() { "a", "c", "a", "F", "A" };
list.Distinct(new LambdaComparer<string>((a,b) => a == b));
Ooh, trochę wymyślne! –
jest to najlepsze rozwiązanie dla tego problemu, które widziałem, geniusz –
bardzo fajne rozwiązanie. Główną wadą jest stworzenie klasy bazowej dla każdego interfejsu. Czy istnieje jakiś prosty sposób, aby uczynić go ogólnym? –
Nie. C# nie obsługuje klas anonimowych (z wyjątkiem anonimowych typów, które nie mogą definiować metod).
Nie, Lambda Expression nie może zaimplementować żadnych dodatkowych interfejsów niż to, co już robi.
Porównujesz także złe rzeczy. Zgaduję, że naprawdę chciałeś zapytać, czy anonimowe typy w języku C# mogą implementować interfejsy. Odpowiedź na to również nie.
- 1. Ogólny interfejs implementujący klasy kończy się niepowodzeniem.
- 2. PHP 7 - Porównanie anonimową klasę Przypadki
- 3. Prywatna klasa wewnętrzna syntezuje nieoczekiwaną anonimową klasę
- 4. Jak instancję anonimową klasy, która implementuje interfejs w Kotlin
- 5. Dynamicznie skomponuj klasę w języku C#
- 6. Pytanie dotyczące płynny interfejs w języku C#
- 7. Interfejs w dynamicznym języku?
- 8. implementujący operator == przy dziedziczeniu
- 9. Interfejs implementujący obiekt TypeScript z dodatkowym błędem właściwości
- 10. Jak napisać ogólną klasę kontenera, która implementuje dany interfejs w języku C#?
- 11. Metody sortowania w tej samej kolejności, co interfejs implementujący w Eclipse
- 12. Jak zadeklarować klasę w języku C#, aby móc łańcuch metod?
- 13. Czy funkcja ma jakąś klasę pamięci w języku C?
- 14. Jak zaimplementować klasę abstrakcyjną w języku F #?
- 15. Czy mogę podać sensowną nazwę klasy anonimowej w języku C#?
- 16. Interfejs Dziedziczenie w C++
- 17. Spychacz próbujący odwzorować klasę na jej interfejs
- 18. Jak utworzyć "pustą" anonimową funkcję w MATLAB?
- 19. Forward deklarując anonimową strukturę z C na C++
- 20. Anuluj subskrypcję metody anonimowej w języku C#
- 21. Graficzny interfejs użytkownika Samouczek w C
- 22. Domyślny interfejs ustaw w C#
- 23. Interfejs wiersza poleceń w C++
- 24. Jaka jest różnica między "deklaruj klasę" i "interfejs" w TypeScript
- 25. Jak zawinąć klasę w java i zapisać interfejs?
- 26. Jak stworzyć płynny interfejs w języku C# z pewnymi ograniczeniami dla niektórych metod?
- 27. Interfejs C# - R
- 28. C# rodzajowych Interfejs kowariancji
- 29. Dlaczego powinienem ustawić interfejs wtyczki w C++ zamiast c
- 30. C realizacja nieruchomość # interfejs
związane http://stackoverflow.com/questions/191013/can-ac-sharp-anonymous-class -implement-an-interface – mcabral
Mylicie wyrażenia lambda (funkcje anonimowe) z anonimowymi klasami. Nie ma sensu funkcja zaimplementowania interfejsów – dtech