Ich habe IServiceHandler
und ein ISalesHandler
und beide erben von Ihandler
Schnittstelle Vererbung gibt
IHandler.cs
public interface IHandler
{
Task AddAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId);
Task AddAuditAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId);
}
IServiceHandler.cs
public interface IServiceHandler : IHandler
{
Task<IEnumerable<ACService>> GetAsync();
Task<IEnumerable<ACServiceAudit>> GetAuditAsync();
}
ISalesHandler.cs
public interface ISalesHandler : IHandler
{
Task<IEnumerable<ACSale>> GetAsync();
Task<IEnumerable<ACSaleAudit>> GetAuditAsync();
}
Dann habe ich eine Methode, die entweder die Verkäufe oder Service gibt, aber das Problem ist, ich es als IHandler
private IHandler CreateHandler(FileType type)
{
switch (type)
{
case FileType.Sales:
return _container.GetExportedValue<ISalesHandler>("Sales");
case FileType.Service:
return _container.GetExportedValue<IServiceHandler>("Service");
case FileType.None:
return null;
}
return null;
}
die nur bewirkt, dass ich kehre zurück Zugriff auf die Methoden in der IHandler
und nicht in IServiceHandler
oder ISalesHandler
.
Wie kann ich die Schnittstellen so strukturieren, dass ich auf alle Methoden zugreifen kann? Ich würde lieber die CreateHandler
Methode beibehalten.
Wie würden Sie die Compiler erwarten wissen, welche Art zurückgeführt werden würde? Wenn ich 'CreateHandler (FileType.Sales)' nenne, wird der Compiler nicht durch den Methodenkörper schauen und wissen, dass das einen 'ISalesHandler' zurückgibt, und deshalb' GetAsync' einen 'Task>' zurückgibt .Grundsätzlich müssen Sie zwischen Informationen zur Kompilierzeit und Informationen zur Ausführungszeit unterscheiden. Der Wert des Parameters für CreateHandler ist die Ausführungszeitinformation und kann daher die Informationen zur Kompilierungszeit nicht beeinflussen. –
Wahrscheinlich besser, wenn Sie sowohl die Schnittstelle und CreateHandler-Methoden generisch machen. Dann können Sie zurück, was Sie wollen, ohne eine Switch-Anweisung. – Baldrick
Pass Typ Parameter zu Ihrer Createhandler Methode oder einfach (IHandler als IServiceHandler) –