Stellen Sie sicher, dass die Type-Instanz einen Typ darstellt, der einer bestimmten Klasse zugewiesen werden kann

8

Ich bin in erster Linie ein Java-Programmierer, also wäre das eines dieser "Was ist das Ding von Java, das in C # äquivalent ist" -Fragen. So können Sie in Java ein Class-Type-Argument zur Kompilierungszeit zurückhalten, um eine bestimmte Super-Klasse zu erweitern:

%Vor%

und sogar

%Vor%

Sie können sogar mehrere Schnittstellen verketten:

%Vor%

Wie wird das in C # gemacht? Ich weiß, dass Sie "where T: BaseClass" verwenden können, aber das ist nur anwendbar, wenn Sie eine Instanz T haben. Was ist, wenn Sie nur eine Type-Instanz haben?

BEARBEITEN:

Zur Erklärung, hier ist was ich gerne tun würde:

MONTAGE # 1 (base.dll):

%Vor%

ASSEMBLY # 2 (sub1.dll, references base.dll):

%Vor%

ASSEMBLY # 3 (sub2.dll, Referenzen base.dll):

%Vor%

ASSEMBLY # 4 (main.dll, Referenzen base.dll):

%Vor%

In diesem Beispiel ist es mir egal, welche Klasse die Variable 'type' repräsentiert, solange sie von BaseClass abgeleitet ist. Wenn ich also eine Instanz erstellt habe, kann ich Foo ().

aufrufen

Die Teile, die kein gültiger C # -Code sind (sondern eher ein Java-Mockup), sind die "generischen" Type-Klassen: Type & lt; T & gt; und Typ & lt; : Basisklasse & gt;.

    
milin 12.12.2016, 13:01
quelle

2 Antworten

2

Nein, es gibt keine Möglichkeit, zur Kompilierzeit zu erzwingen, dass ein Type einem generischen Typ zuweisbar ist. Wenn ich richtig verstehe, was du willst, ist:

%Vor%

Was bedeutet:

%Vor%

Offensichtlich zur Laufzeit ist es trival, aber die Sprache hat zur Kompilierzeit keine Unterstützung dafür.

    
InBetween 12.12.2016, 14:12
quelle
2

Nach dem, was ich verstanden habe, sprechen Sie über generische Typenbeschränkung

%Vor%

Hier ein anderer Artikel: Einschränkungen für Typparameter (C # -Programmierhandbuch)

  

Wenn Sie eine generische Klasse definieren, können Sie Einschränkungen für die   Arten von Typen, die Client-Code für Type-Argumente verwenden kann, wenn es   instanziiert Ihre Klasse. Wenn Client-Code versucht, Ihre Instanz zu instanziieren   Klasse, indem Sie einen Typ verwenden, der von einer Integritätsbedingung nicht zugelassen ist   ist ein Kompilierungsfehler.

BEARBEITEN:

Hier Ihr Beispiel. Wenn Sie jetzt versuchen, BaseClassUtil.CallFoo<T> mit etwas anderem als BaseClass und seinen abgeleiteten Klassen aufzurufen, erhalten Sie einen Kompilierungsfehler. Hier vollständiges Beispiel in dotNetFiddle . Der knifflige Teil ist also die Einschränkung Ihrer Klasse sollte in der Util-Klasse passieren

%Vor%     
mybirthname 12.12.2016 13:12
quelle

Tags und Links