일부 데이터 원본에서 데이터 가져 오기 및 게시를 일반화하는 클래스 시스템을 만들려고합니다. 두 가지 방법이 있습니다 : 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을 사용할 수 없습니다.
요약하면 입력 및 출력을 제네릭 형식으로하고 Constraint Input이 콘크리트 IDataSource 구현과 일치하도록하고 싶습니다.
당신은 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