Ich möchte ein Klassensystem erstellen, um die Daten aus einer bestimmten Datenquelle zu generalisieren und zu veröffentlichen. Ich habe zwei Methoden: GetData und PostData. Beide Methoden sollten eine Art von Eingabe haben, und GetData sollte auch Rückgabetyp haben. Ich habe versucht, generische Schnittstelle zu schreiben und es in „DatabaseSource“ Klasse zu implementieren:Generische Schnittstellenimplementierung: Generischer Rückgabetyp und generischer Eingabetyp
public class QueryParameter
{
public QueryParameter()
{
this.Direction = ParameterDirection.Input;
}
public string Name { get; set; }
public object Value { get; set; }
public ParameterDirection Direction { get; set; }
}
public class InputBase
{
public InputBase()
{
ResultMapping = new Dictionary<string, string>();
Parameters = new List<QueryParameter>();
}
public Dictionary<string, string> ResultMapping { get; set; }
public List<QueryParameter> Parameters { get; set; }
}
public class DatabaseInput: InputBase
{
public string Query { get; set; }
public DatabaseCommandType CommandType { get; set; }
}
public interface IDataSource<I> where I: InputBase
{
IEnumerable<T> GetData<T>(I input);
void PostData(I Input);
}
Jetzt i-Schnittstelle wie dies umzusetzen versuche:
public class DatabaseDataSource: IDataSource<DatabaseInput>
{
public IEnumerable<T> GetData<T>(DatabaseInput Input)
{
//implementation
}
public void PostData(DatabaseInput Input)
{
//implementation
}
}
Aber ich habe ein Problem, wenn ich versuche, Daten zu instanziieren Quelle wie folgt aus:
IDataSource<InputBase> dataSource = new DatabaseDataSource();
ich Database nicht, weil dieser Code in einer Art Factory-Methode ist, und ich sollte in der Lage zu instanziiert andere IDataSource Implementierungen verwenden können.
Kurz gesagt, ich möchte Eingabe und Ausgabe als generische Typen haben und Constraint-Eingabe, um konkrete IDataSource-Implementierung zu entsprechen.
Sie können dies über die Wo Operator http://StackOverflow.com/Questions/1096568/How-Cani-I-I-Interface-as-Ac-Sharp-Generic-Type-Constraint –
Ich habe versucht, wo Operator verwenden , kann aber immer noch nicht wie im letzten Codeabschnitt in meiner Frage instanziieren – vpetrovic
'DatabaseDataSource' ist eine' IDataSource 'nicht eine' IDataSource '. Sie können keine Kovarianz mit konkreten Typen durchführen. Siehe: https://msdn.microsoft.com/en-gb/library/dd799517(v=vs.110).aspx –
TheInnerLight