В контексте я создаю класс-оболочку для веб-служб Navision.Реализация универсального приемника List с типом, определяемым внутренним дочерним объектом?
Они имеют следующую структуру:
class JobList_Service : SoapHttpClientProtocol
{
public Job[] ReadMultiple()
{
...
}
}
я хотел бы сделать что-то вроде следующего:
var jobWS = new NavService<JobList_Service>();
jobWS.GetAll<Job>();
Я борющегося с обобщениями, я как-то нужно объявить второй тип поскольку он принимает JobList_Service как тип, поэтому возвращает список JobList_Service, чего я не хочу.
Вот моя реализация до сих пор:
public class NavService<T> where T : SoapHttpClientProtocol, new()
{
private T serviceInstance {get; set;}
public NavService()
{
serviceInstance = new T();
ADSecurity.AuthenticateService_CurrentUser(serviceInstance);
}
public List<T> GetAll()
{
try
{
MethodInfo method = serviceInstance.GetType().GetMethod("ReadMultiple");
ParameterInfo[] paramTypes = method.GetParameters(); //We know that ReadMultiple takes three arguments, we will make that assumption here.
var filter = Activator.CreateInstance(paramTypes[0].ParameterType, 0);
object[] parameters = { filter, "", new Int32() };
var ret = (List<T>)/*Problem with this cast, obviously*/ method.Invoke(serviceInstance, parameters) ;
return ret;
} catch (Exception ex)
{
throw ex;
}
}
}
* EDIT: Если кто-то может предложить лучшее название, не стесняйтесь, я не знаю правильную терминологию.
Хм, но JobList_Service автоматически генерируется кода, не нужно ли добавлять интерфейс к его объявлению каждый раз, когда я его создаю? – David
Что я не понимал - в этом случае вместо прямого применения интерфейса я просто написал небольшие адаптеры, которые отражают сигнатуры метода, но реализуют интерфейс, который возвращается к исходным сервисам. –
Похоже, мне нужно провести некоторое исследование о том, как это сделать, немного новое для дженериков. – David