Я хочу создать систему классов для обобщения получения и публикации данных из некоторого источника данных. У меня есть два метода: GetData и PostData. Оба метода должны иметь какой-то ввод, а GetData также должен иметь тип возврата. Я попытался написать общий интерфейс и реализовать его в классе «DatabaseSource»:Общая реализация интерфейса: общий тип возвращаемого типа и общий тип ввода
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);
}
Теперь я пытался реализовать интерфейс, как это:
public class DatabaseDataSource: IDataSource<DatabaseInput>
{
public IEnumerable<T> GetData<T>(DatabaseInput Input)
{
//implementation
}
public void PostData(DatabaseInput Input)
{
//implementation
}
}
Но у меня есть проблема, когда я пытаюсь создать экземпляр данных источник, как это:
IDataSource<InputBase> dataSource = new DatabaseDataSource();
Я не могу использовать DatabaseInput, потому что этот код в какой-то заводским способом, и я должен быть в состоянии создать экземпляр других реализаций IDataSource.
Вкратце я хочу иметь входные и выходные данные как общие типы и ограничивать входные данные для соответствия конкретной реализации IDataSource.
Вы можете сделать это с помощью оператора http://stackoverflow.com/questions/1096568/how-can-i-use-interface-as-ac-sharp-generic-type-constraint –
Я пробовал использовать, где оператор , но все равно не может быть экземпляром, как в последнем разделе кода в моем вопросе – vpetrovic
'DatabaseDataSource' является' IDataSource 'не' IDataSource '. Вы не можете делать ковариацию с конкретными типами. См. Https://msdn.microsoft.com/en-gb/library/dd799517(v=vs.110).aspx –
TheInnerLight