2012-03-14 80 views
2

我想处理文件,因为它们保存在四个目录中,它们都以非常不同的方式处理。无法将源接口类型转换为目标接口类型

我有一个在调度计时器上运行的公共处理器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 
    } 

} 
+0

如何'KyoCustomProcessor'执行'IExecutionProvider'?它明确是一个'IKyoExecutionProcessor'。 – 2012-03-14 14:29:55

回答

1

泛型救援...

//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 
    } 
} 
+0

我在见到你之前接受了第一个答案,但是非常感谢你。我会实现你的版本。 +1为您的答案。 – strattonn 2012-03-14 15:19:23

+0

如果你愿意,你可以改变接受的答案,我想。无论如何感谢+1。 – ja72 2012-03-14 15:27:30

1

IKyoExecutionProcessor接口应该从IExecutionProvider得出这样的:

public interface IKyoExecutionProcessor : IExecutionProvider 
{ 
    string DestinationPath { get; set; } 
} 

这可以确保有一个“is-a的”接口之间的关系,这也将让你实现KyoExecutionProcessor类像此:

public class KyoExecutionProcessor : IKyoExecutionProcessor 
{ 
    public void ProcessFile(string file) { ... } 
    public string DestinationPath { get; set; } 
} 

这种方式,实现IKyoExecutionProcessor任何对象可以被分配到类型的变量。

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

完美。谢谢! – strattonn 2012-03-14 15:14:17

相关问题