我想处理保存在四个目录中的文件,它们的处理方式都非常不同。
我有一个通用处理器 IFileQueueService,它在调度计时器上运行,加载所有文件名并为每个文件调用自定义处理器 IExecutionProcessor。这可能是一个简单的问题,但我的处理器具有比标准 IExecutionProvider 更多的属性,并且我不确定如何调用这些自定义处理器。
//Basic processor interface
public interface IExecutionProvider
{
void ProcessFile(string file);
}
//Simplified version of one of the custom processor interfaces
public interface IKyoExecutionProcessor
{
string DestinationPath { get; set; }
}
public class KyoExecutionProcessor : IExecutionProvider, IKyoExecutionProcessor
{
//This processor moves a file to the DestinationPath.
}
public interface IFileQueueService
{
string SourcePath { get; set; }
IExecutionProvider ExecutionProvider { get; set; }
void Start();
void Stop();
}
public class FileProcessor : IFileQueueService
{
...
public virtual void ProcessFileQueue()
{
IEnumerable<string> filesToProcess = GetFilesReadyToProcess();
foreach (string file in filesToProcess.ToList())
{
ExecutionProvider.ProcessFile(file);
}
}
}
public class KYOFileSysWatcher : ServiceBase
{
private IFileQueueService Processor { get; set; }
private IKyoExecutionProcessor KyoCustomProcessor { get; set; }
public KYOFileSysWatcher()
{
Processor = ObjectFactory.GetInstance<IFileQueueService>();
KyoCustomProcessor = ObjectFactory.GetInstance<IKyoExecutionProcessor>();
//This doesn't work, cannot convert source type to target type, but it implements the IExecutionProvider interface??? How do I do this?
Processor.ExecutionProvider = KyoCustomProcessor;
Processor.Start(); //Sets up dispatch timer
}
}
最佳答案
泛型来救援......
//Basic processor interface
public interface IExecutionProvider
{
void ProcessFile(string file);
}
//Simplified version of one of the custom processor interfaces
public interface IKyoExecutionProcessor
{
string DestinationPath { get; set; }
}
public interface IFileQueueService<TProvider>
where TProvider : IExecutionProvider
{
string SourcePath { get; set; }
TProvider ExecutionProvider { get; set; }
void Start();
void Stop();
}
public class FileProcessor<TProvider> : IFileQueueService<TProvider>
where TProvider : IExecutionProvider
{
string[] GetFilesReadyToProcess() { return new string[0]; }
public TProvider ExecutionProvider { get; set; }
public virtual void ProcessFileQueue()
{
IEnumerable<string> filesToProcess = GetFilesReadyToProcess();
foreach (string file in filesToProcess.ToList())
{
ExecutionProvider.ProcessFile(file);
}
}
#region IFileQueueService<TProvider> Members
public string SourcePath { get; set; }
public void Start() { }
public void Stop() { }
#endregion
}
public class KyoExecutionProcessor : IExecutionProvider, IKyoExecutionProcessor
{
//This processor moves a file to the DestinationPath.
public string DestinationPath { get; set; }
public void ProcessFile(string file) { }
}
public class ServiceBase<TProcessor>
where TProcessor : IExecutionProvider
{
protected FileProcessor<TProcessor> Processor { get; set; }
protected TProcessor CustomProcessor { get; set; }
}
public class KYOFileSysWatcher : ServiceBase<KyoExecutionProcessor>
{
public KYOFileSysWatcher()
{
Processor = ObjectFactory.GetInstance<FileProcessor<KyoExecutionProcessor>>();
CustomProcessor = ObjectFactory.GetInstance<KyoExecutionProcessor>();
//This compiles now!
Processor.ExecutionProvider = CustomProcessor;
Processor.Start(); //Sets up dispatch timer
}
}
关于c# - 无法将源接口(interface)类型转换为目标接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9703831/