2009-07-09 12 views

Odpowiedz

4

C# i CLR nie obsługują ogólnych ograniczeń interfejsu, chociaż można je ograniczyć do konkretnego interfejsu (zobacz inne odpowiedzi). Najbliższym, co można uzyskać, jest "klasa" i sprawdź typ za pomocą refleksji w czasie uruchamiania. Obawiam się. Po co miałbyś ograniczać interfejs?

+0

Może być zaimplementowany niestandardowy/szalony zaimplementowany wtrysk zależności. Ale to mnie zgaduję. – Felype

6

Jeśli proszą o dodanie ograniczenia do konkretnego interfejsu, to proste:

public void Register<T>(T data) where T : ISomeInterface 

Jeśli pytasz czy słowo istnieje jak klasy lub struktury, aby ograniczyć zakres możliwych rodzajów dla T, które jest niedostępne.

Chociaż można napisać:

public void Register<T>(T data) where T : class // (or struct) 

nie można napisać:

public void Register<T>(T data) where T : interface 
0

Nie można domagać się, że T jest interfejsem, więc trzeba by użyć refleksji w czasie wykonywania, aby to potwierdzić.

0

Jeśli to możliwe, wybrałem takie rozwiązanie. Działa to tylko wtedy, gdy chcesz, aby kilka specyficznych interfejsów (na przykład tych, do których masz dostęp do źródła) zostało przekazanych jako parametr ogólny, a nie żadnych.

  • Pozwoliłem moim interfejsom, które zakwestionowały, odziedziczyć pusty interfejs IInterface.
  • I ograniczane rodzajowego parametr T, aby mieć IInterface

w źródle, wygląda to tak:

  • dowolnego interfejsu chcesz być przekazany jako parametr Generic:

    public interface IWhatever : IInterface 
    { 
        // IWhatever specific declarations 
    } 
    
  • IInterface:

    public interface IInterface 
    { 
        // Nothing in here, keep moving 
    } 
    
  • Klasa, na którym chcesz umieścić ograniczenie typu:

    public class WorldPieceGenerator<T> where T : IInterface 
    { 
        // Actual world piece generating code 
    } 
    
Powiązane problemy