6

私はRxを初めて使用し、現在のプロジェクトでRxを使用したいと考えています。ファイルウォッチャーシステムを実装しようとしています。少なくとも今のところ、私はファイル作成イベントにのみ興味があります。しかし、以下のコードを実行しようとすると、「値をnullにすることはできません」というエラーメッセージが表示されます。誰かが以下のコードで私を助けてくれませんか。

class Program
{
    static void Main(string[] args)
    {
        IDisposable writer = new FileSystemObservable(@"D:\Code\Rx\Dropbox\", "*.*", false)
                            .CreatedFiles
                            .Where(x => (new FileInfo(x.FullPath)).Length > 0)
                            .Select(x => x.Name)
                            .Subscribe(Console.WriteLine);
        Console.ReadLine();
    }
}


class FileSystemObservable
{
    private readonly FileSystemWatcher fileSystemWatcher;

    public FileSystemObservable(string directory, string filter, bool includeSubdirectories)
    {
        fileSystemWatcher = new FileSystemWatcher(directory, filter)
            {
                EnableRaisingEvents = true,
                IncludeSubdirectories = includeSubdirectories
            };

        CreatedFiles = Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>
                (h => fileSystemWatcher.Created += h,
                h => fileSystemWatcher.Created -= h)
                .Select(x => new { x.EventArgs }) as IObservable<FileSystemEventArgs>;

        Errors = Observable.FromEventPattern<ErrorEventHandler, ErrorEventArgs>
                (h => fileSystemWatcher.Error += h,
                h => fileSystemWatcher.Error -= h)
                .Select(x => new { x.EventArgs }) as IObservable<ErrorEventArgs>;
    }

    public IObservable<ErrorEventArgs> Errors { get; private set; }

    public IObservable<FileSystemEventArgs> CreatedFiles { get; private set; }
}
4

1 に答える 1

6

の結果

Select(x => new { x.EventArgs }) as IObservable<ErrorEventArgs> 

.Select(x => new { x.EventArgs }) as IObservable<FileSystemEventArgs>;

行は常にnullを返します。

のタイプSelect(x => new { x.EventArgs })IObservable<'a>'a匿名タイプです。

代わりに以下を使用する必要があります。

CreatedFiles = 
    Observable.FromEventPattern<FileSystemEventHandler, FileSystemEventArgs>(
        h => fileSystemWatcher.Created += h,
        h => fileSystemWatcher.Created -= h)
    .Select(x => x.EventArgs);

Errors = 
    Observable.FromEventPattern<ErrorEventHandler, ErrorEventArgs>(
        h => fileSystemWatcher.Error += h,
        h => fileSystemWatcher.Error -= h)
    .Select(x => x.EventArgs);
于 2012-12-02T14:30:33.320 に答える