7 Stimmen

C#-Typinferenz eines generischen Methodentypparameters, wenn die Methode keine Argumente hat

Gegeben die folgende generische Schnittstelle und die implementierende Klasse:

public interface IRepository<T> {
    // U has to be of type T of a subtype of T
    IQueryable<U> Find<U>() where U : T;
}

public class PersonRepository : IRepository<Employee> {

}

Wie kann ich die Find-Methode ohne Angabe von U aufrufen?

var repository = new EmployeeRepository();
// Can't be done
IQueryable<Employee> people = repository.Find();

// Has to be, but isn't Employee a given in this context?
IQueryable<Employee> people = repository.Find<Employee>();

// Here I'm being specific
IQueryable<Manager> managers = repository.Find<Manager>();

Mit anderen Worten, was kann getan werden, um eine Typisierung zu erhalten?

Merci !

15voto

Pop Catalin Punkte 59610

Wie kann ich die Find-Methode aufrufen? ohne die Angabe von U aufrufen?

Das können Sie nicht.

Leider C#'s generische Methode Überladung Auflösung nicht übereinstimmen basierend auf Rückgabewerte.

Siehe Eric Lipperts Blogbeitrag darüber: C# 3.0 Rückgabetyp-Inferenz funktioniert nicht auf Methodengruppen

Aber eine einfache Möglichkeit, dies zu schreiben, ist die Verwendung von var Stichwort.

var employees = repository.Find<Employee>();

6voto

Adam Ralph Punkte 28333

Wie wäre es mit dem Schreiben

var people = repository.Find<Employee>();

Das spart dieselbe Menge an Tipparbeit, aber auf eine andere Art und Weise.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X