Sto cercando di implementare un C++ come modello con C# generici e modello politica basata sul this answerImplementazione multiparametrica C modello ++ come comportamento in C# utilizzando Criteri modello
Questo è un esempio del modello:
interface ISomePolicy<T,U>
{
void _doSomething(U u);
}
class MyClass<T,U>:
ISomePolicy<int, double>,
ISomePolicy<int, int>
{
internal T myElement {get;set;}
public MyClass(T Element) {
myElement = Element;
}
void ISomePolicy<int, double>._doSomething(double u)
{
Console.WriteLine("this is int, double");
}
void ISomePolicy<int, int>._doSomething(int u)
{
Console.WriteLine("this is int, int");
}
}
static class MyClassExtension
{
//What I want to do
public static void doSomething<P, T, U>(this P oTh, U u) where P : MyClass<T, U>, ISomePolicy<T, U>
{
oTh._doSomething(u);
}
}
il mio comportamento previsto è come questo:
MyClass<int, double> oClass = new MyClass<int, double>(3);
oClass.doSomething(0.5); //This works
oClass.doSomething(1); //This works
oClass.doSomething("This should fail"); //Breaks at compile time
MyClass<string, double> oClass1 = new MyClass<string, double>("sadfsd"); //Not implemented, wasn't able to prevent the construction.
oClass1.doSomething(0.4); //Breaks at compile time
Ma finora non è stato in grado di fare .net accettare Generic Extension with less arguments than parameters
Posso chiamare l'interfaccia esplicitamente, che è orribile verbose che sconfigge lo scopo di tutto questo.
oClass.doSomething < MyClass<int, double>,int,double>(0.5);
ho pensato di lavorare che in giro con un avvolgitore:
static class MyClassExtension{
private static void wrappedDoSomething<P, T, U>(this P oTh, U u)
where P : MyClass<T, U>, ISomePolicy<T, U>
{
oTh._doSomething(u);
}
public static void doSomething<T, U>(this MyClass<T, U> oTh, U u)
{
oTh.wrappedDoSomething<MyClass<T, U>, T, U>(u);
}
}
Ma l'involucro non può risolvere entrambi i tipi per la funzione avvolto, non riuscendo con:
di errore 1 Il digitare "MyClass" non può essere utilizzato come parametro di tipo "P" nel tipo o metodo generico "MyClassExtension.wrappedDoSomething (P, U)". Non vi sono conversione riferimento implicito da 'MyClass' a 'ISomePolicy'
Eventuali spunti per risolvere il problema parametri o riprogettare tutto questo sono apprezzati.
Per il contesto questo sarebbe utilizzato per avvolgere i traduttori I/O. T
nel mio caso sarebbe il formato I/O di destinazione e U
la rappresentazione dell'oggetto di quei dati utilizzati dal mio framework.
Sono consapevole che questo può essere facilmente ottenuto con delegati o interfacce, ma l'obiettivo è che l'utente framework istanzia facilmente la traduzione desiderata, e se un'implementazione non esiste, può essere banalmente aggiunta ad un comune interfaccia.
MODIFICA: la risoluzione di un metodo generico dall'interno di un altro metodo/classe generico non sembra funzionare su mono.
Perché è necessario il parametro T? –
Per verificare al momento della compilazione che 'ISomePolicy' è implementato da 'MyClass' (vedi' MyClassExtension') –
xvan