クラスシステムを作成して、一部のデータソースからデータを取得してポスティングを一般化する必要があります。私は2つのメソッドを持っています:GetDataとPostData。両方のメソッドには何らかの入力が必要で、GetDataには戻り型も必要です。 ジェネリックインターフェイスの実装:汎用戻り型と汎用入力型
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);
}
は今、私はこのようなインターフェイスを実装してみました:私は、一般的なインタフェースを記述すると「DatabaseSource」クラスでそれを実装しようとした
public class DatabaseDataSource: IDataSource<DatabaseInput>
{
public IEnumerable<T> GetData<T>(DatabaseInput Input)
{
//implementation
}
public void PostData(DatabaseInput Input)
{
//implementation
}
}
しかし、私はデータをインスタンス化しようとすると、私は問題を抱えていますこのようなソース:
IDataSource<InputBase> dataSource = new DatabaseDataSource();
このコードは、ファクトリメソッドのいくつかの種類であると私は他のあるIDataSourceの実装をインスタンス化することができるはずですので、私はDatabaseInputを使用することはできません。
要するに、入力と出力をジェネリック型として、具体的なIDataSource実装と一致するようにInputを制約したいとします。
これは、where演算子で行うことができます。http://stackoverflow.com/questions/1096568/how-can-i-use-interface-as-ac-sharp-generic-type-constraint –
where演算子私の質問の最後のコードセクションのようにインスタンス化することはできません – vpetrovic
'DatabaseDataSource'は' IDataSource 'ではなく、' IDataSource 'です。コンクリート型の共分散はできません。参照してください:https://msdn.microsoft.com/en-gb/library/dd799517(v=vs.110).aspx –
TheInnerLight