C# 无法将源接口类型转换为目标接口类型

C# 无法将源接口类型转换为目标接口类型,c#,interface,C#,Interface,我想处理文件,因为它们保存在四个目录中,它们都以非常不同的方式处理 我有一个公共处理器IFileQueueService,它在调度计时器上运行,加载所有文件名,并为每个文件调用自定义处理器IExecutionProcessor。这可能是一个简单的问题,但我拥有比标准IExecutionProvider更多属性的处理器,我不知道如何调用这些自定义处理器 //Basic processor interface public interface IExecutionProvider { voi

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

我有一个公共处理器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
    }

 }
//基本处理器接口
公共接口IExecutionProvider
{
无效进程文件(字符串文件);
}
//一个自定义处理器接口的简化版本
公共接口IKyoExecutionProcessor
{
字符串目标路径{get;set;}
}
公共类KyoExecutionProcessor:IEExecutionProvider、IKyoExecutionProcessor
{
//此处理器将文件移动到DestinationPath。
}
公共接口IFileQueueService
{
字符串源路径{get;set;}
IExecutionProvider ExecutionProvider{get;set;}
void Start();
无效停止();
}
公共类文件处理器:IFileQueueService
{
...
公共虚拟无效ProcessFileQueue()
{
IEnumerable filesToProcess=GetFileReadyToProcess();
foreach(filesToProcess.ToList()中的字符串文件)
{
ExecutionProvider.ProcessFile(文件);
}
}
}
公共类KYOFileSysWatcher:ServiceBase
{
专用IFileQueueService处理器{get;set;}
私有IKyoExecutionProcessor KyoCustomProcessor{get;set;}
公共KYOFileSysWatcher()
{
Processor=ObjectFactory.GetInstance();
KyoCustomProcessor=ObjectFactory.GetInstance();
//这不起作用,无法将源类型转换为目标类型,但它实现了IExecutionProvider接口???如何实现?
Processor.ExecutionProvider=KyoCustomProcessor;
Processor.Start();//设置调度计时器
}
}

您的
IKyoExecutionProcessor
接口应派生自
IExecutionProvider
,如下所示:

public interface IKyoExecutionProcessor : IExecutionProvider 
{
    string DestinationPath { get; set; }
}
public class KyoExecutionProcessor : IKyoExecutionProcessor
{
   public void ProcessFile(string file) { ... }
   public string DestinationPath { get; set; }
}
这确保了接口之间存在“is-a”关系,这也将使您能够实现
KyoExecutionProcessor
类,如下所示:

public interface IKyoExecutionProcessor : IExecutionProvider 
{
    string DestinationPath { get; set; }
}
public class KyoExecutionProcessor : IKyoExecutionProcessor
{
   public void ProcessFile(string file) { ... }
   public string DestinationPath { get; set; }
}
这样,任何实现
IKyoExecutionProcessor
的对象都可以分配给
IExecutionProvider
类型的变量

Processor.ExecutionProvider = KyoCustomProcessor; // You can now appoint IKyoExecutionProcessor instance to IExecutionProvider variable

拯救泛型

//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
    }
}
//基本处理器接口
公共接口IExecutionProvider
{
无效进程文件(字符串文件);
}
//一个自定义处理器接口的简化版本
公共接口IKyoExecutionProcessor
{
字符串目标路径{get;set;}
}
公共接口IFileQueueService
其中TProvider:IExecutionProvider
{
字符串源路径{get;set;}
TProvider ExecutionProvider{get;set;}
void Start();
无效停止();
}
公共类文件处理器:IFileQueueService
其中TProvider:IExecutionProvider
{
string[]GetFileReadyToProcess(){返回新字符串[0];}
公共TProvider ExecutionProvider{get;set;}
公共虚拟无效ProcessFileQueue()
{
IEnumerable filesToProcess=GetFileReadyToProcess();
foreach(filesToProcess.ToList()中的字符串文件)
{
ExecutionProvider.ProcessFile(文件);
}
}
#区域IFileQueueService成员
公共字符串源路径{get;set;}
public void Start(){}
公共无效停止(){}
#端区
}
公共类KyoExecutionProcessor:IEExecutionProvider、IKyoExecutionProcessor
{
//此处理器将文件移动到DestinationPath。
公共字符串目标路径{get;set;}
公共void进程文件(字符串文件){}
}
公共类服务库
其中TProcessor:IExecutionProvider
{
受保护的文件处理器{get;set;}
受保护的TProcessor CustomProcessor{get;set;}
}
公共类KYOFileSysWatcher:ServiceBase
{
公共KYOFileSysWatcher()
{
Processor=ObjectFactory.GetInstance();
CustomProcessor=ObjectFactory.GetInstance();
//现在编译!
Processor.ExecutionProvider=CustomProcessor;
Processor.Start();//设置调度计时器
}
}

KyoCustomProcessor如何实现IEExecutionProvider?这显然是一个
IKyoExecutionProcessor
。在看到你的答案之前,我接受了第一个答案,但谢谢你。我将实现您的版本+我想如果你愿意的话,你可以改变你的答案。无论如何,谢谢你的+1。