interfacce generiche
-
24-09-2019 - |
Domanda
Ecco il mio codice
public interface ITranslator<E, R>
{
E ToEntity<T>(R record);
}
class Gens : ITranslator<string, int>
{
#region ITranslator<string,int> Members
public string ToEntity<MyOtherClass>(int record)
{
return record.ToString();
}
#endregion
}
Quando compilo questo, ottengo un errore Type parameter declaration must be an identifier not a type
Perché è che non posso avere ToEntity<MyOtherClass>
ma può avere solo ToEntity<T>
??
Modifica: che cosa sta facendo MyOtherClass
? Io sono la conversione tra le entità (pocos equivalente di Entity Framework) e registrare (oggetto restituito dal quadro) per più tabelle / classi. Quindi vorrei usare questo per fare la mia conversione specifica classe
Soluzione
L'interfaccia ha un metodo ToEntity<T>
generico che hai fatto non generico nella classe di implementazione Gens
come ToEntity<MyOtherClass>
. (A generici metodo potrebbe prendere qualsiasi tipo di parametro, forse dato alcuni vincoli T
. La vostra classe Gens
sta cercando di fornire una definizione di ToEntity
solo per il tipo di parametro MyOtherClass
, che sconfigge lo scopo di farmaci generici.)
Nel tuo esempio di codice, non è chiaro come la classe Gens
sta cercando di utilizzare il tipo di MyOtherClass
; Non è certamente coinvolto nella logica del ToEntity
. Avremmo bisogno di più informazioni per essere in grado di guidare l'utente ulteriormente.
Per illustrare, ecco che cosa il vostro attuale definizione delle offerte interfaccia ITranslator<E, R>
, in parole povere:
"Io fornisco un meccanismo di tradurre qualsiasi atto di tipo
R
in un'entità di tipoE
, questo meccanismo essendo dipende da alcun tipo specificato dall'utenteT
".
La classe Gens
, d'altra parte, il modo in cui è attualmente progettato, "attrezzi" l'interfaccia di cui sopra in questo modo:
"posso tradurre interi in stringhe. Fornisco il illusione di permettere all'utente di specificare un tipo di controllo come viene eseguita questa traduzione, ma in realtà non c'è nessuna scelta di tipo. La classe
MyOtherClass
è coinvolto in qualche modo; questo è tutto quello che posso dire. "
Da queste due descrizioni, è chiaro che la classe Gens
non è realmente facendo quello che le garanzie di interfaccia ITranslator<E, R>
. Vale a dire, non è disposto ad accettare un tipo specificato dall'utente per il suo metodo di ToEntity
. Ecco perché il codice non viene compilato per voi.
Altri suggerimenti
Si deve dichiarare un vincolo su un tipo generico.
public string ToEntity<T>(int record) where T : MyOtherClass
che compila bene per me in LINQPad. Forse avete un tipo di nome E, R, T o da qualche parte?
Ahh vedo quello che stai cercando di fare ... avete MyOtherClass definito come un posto di classe ma si sta cercando di usarlo come un argomento di tipo in ToEntity. Esattamente come si desidera MyOtherClass coinvolto in ToEntity?