c# - 无法将源接口(interface)类型转换为目标接口(interface)类型

标签 c# interface

我想处理保存在四个目录中的文件,它们的处理方式都非常不同。

我有一个通用处理器 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/

相关文章:

c# - 正确的语法;没有结果

c# - 在 Visual Studio 2008 for .NET CF 中处理不同的分辨率

c# - 如何从asp.net core mvc html helper静态方法中的html helper上下文获取urlHelper

c# - 多态性不适用于 C# 中泛型类的调用

delphi - Delphi 2010 中返回泛型接口(interface)的泛型方法

java - 在 Java 中使用类型化接口(interface)比接收特定类型的方法有什么优势?

c# - 添加自定义 SoapClient header

c# - 如何在未知状态下从 Entity Framework 数据库连接使用 SqlBulkCopy

java - 枚举默认方法

xml - 将 XML 节点绑定(bind)到 TreeView 节点