2010-04-14 35 views
6

Tôi đang cố gắng viết chương trình có thể theo dõi nhiều thư mục để tạo tệp và khởi chạy cùng một hành động nhưng với các cài đặt khác nhau cho mỗi thư mục. Vấn đề của tôi là xác định một tham số bổ sung cho FileSystemEventHandler. Tôi tạo ra một FileWatcher mới cho mỗi thư mục để theo dõi và thêm handler cho Created-action:Tham số bổ sung cho FileSystemEventHandler

foreach (String config in configs) 
{ 
    ... 
    FileWatcher.Created += new System.IO.FileSystemEventHandler(FileSystemWatcherCreated) 
    ... 
} 

void FileSystemWatcherCreated(object sender, System.IO.FileSystemEventArgs e, MySettings mSettings) 
{ 
    DoSomething(e.FullPath, mSettings); 
} 

Làm thế nào tôi có thể nhận được các biến 'mSettings' truyền cho FileSystemWatcherCreated()?

+0

Nơi 'mSettings' được đặt? – James

+0

Xin lỗi vì ví dụ xấu. mSettings được đặt ở vị trí đầu tiên ... từ cấu hình hiện tại nhưng tôi nghĩ nó không thực sự liên quan đến câu hỏi. – peku

Trả lời

3
foreach (String config in configs) 
{ 
    ... 
    FileWatcher.Created += (s,e) => DoSomething(e.FullPath, mSettings); 
    ... 
} 
+0

Bạn làm cách nào để hủy đăng ký khỏi sự kiện? Điều gì sẽ xảy ra nếu lần đầu tiên ... mở rộng thành mSettings.MyProperty = config? – Henrik

+2

Có cảm ơn bạn! Hoạt động chính xác như tôi muốn. Tôi biết phải có một cách đơn giản để đạt được điều này. – peku

+1

+1 Bài cũ, nhưng tìm thấy nó google'ing nó và giúp tôi, quá – YvesR

0

Bạn không thể yêu cầu thêm thông tin ngoài những gì mà trình xử lý FileWatcher cung cấp. Những gì bạn có thể làm tuy nhiên là để tạo ra một lớp học nhỏ có quyền truy cập vào cấu hình và cũng có một đại biểu mà bạn có thể gắn vào 's FileWatcherCreated kiện

class Program 
{ 
    static void Main(string[] args) 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher("yourpath"); 

     var configurations = new IConfiguration[] 
           { 
            new IntConfiguration(20), 
            new StringConfiguration("Something to print") 
           }; 

     foreach(var config in configurations) 
      watcher.Created += config.HandleCreation; 
    } 

    private interface IConfiguration 
    { 
     void HandleCreation(object sender, FileSystemEventArgs e); 
    } 

    private class IntConfiguration : IConfiguration 
    { 
     public IntConfiguration(int aSetting) 
     { 
      ASetting = aSetting; 
     } 

     private int ASetting { get; set; } 

     public void HandleCreation(object sender, FileSystemEventArgs e) 
     { 
      Console.WriteLine("Consume your settings: {0}", ASetting); 
     } 
    } 

    public class StringConfiguration : IConfiguration 
    { 
     public string AnotherSetting { get; set;} 

     public StringConfiguration(string anotherSetting) 
     { 
      AnotherSetting = anotherSetting; 
     } 

     public void HandleCreation(object sender, FileSystemEventArgs e) 
     { 
      Console.WriteLine("Consume your string setting: {0}", AnotherSetting); 
     } 
    } 
} 
+1

Điều này chính xác lý do tại sao bạn nên sử dụng bao đóng, và không viết tất cả các mã không cần thiết thêm này. – leppie

0

Bạn cần phải hiểu những gì bạn đang sử dụng. FileSystemEventHandler 's định nghĩa là-

public delegate void FileSystemEventHandler(object sender, FileSystemEventArgs e);

Bạn không thể vượt qua đối số thứ ba. Để truyền dữ liệu 'mSettings', bạn có thể phải viết mã phụ của riêng mình, tôi sợ.

5

foreach (String config in configs) 
{ 
    ... 
    MySettings mSettings = new MySettings(...); // create a new instance, don't modify an existing one 
    var handler = new System.IO.FileSystemEventHandler((s,e) => FileSystemWatcherCreated(s,e,msettings)); 
    FileWatcher.Created += handler; 
    // store handler somewhere, so you can later unsubscribe 
    ... 
} 

void FileSystemWatcherCreated(object sender, System.IO.FileSystemEventArgs e, MySettings mSettings) 
{ 
    DoSomething(e.FullPath, mSettings); 
} 
+0

Cảm ơn bạn cho điều này cũng có vẻ là một phiên bản "hoàn chỉnh" của câu trả lời tôi chấp nhận nhưng vì tôi sẽ không cần phải hủy đăng ký tôi nghĩ rằng tôi sẽ gắn bó với cách tiếp cận đơn giản nhất. +1 – peku

Các vấn đề liên quan