2016-07-18 3 views
-1

ich möchte diesen Code (Arbeits Code in C#) konvertieren in C++/cliZusätzliche Parameter für FileSystemEventHandler in C++/cli

 static private void onChange(object s, FileSystemEventArgs e, string customArg) 
    { 
     Console.WriteLine(e.FullPath); 
     Console.WriteLine(customArg); 
    } 

    static void Main(string[] args) 
    { 
     string customArg = "myCustomArg"; 

     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = "G:\\"; 
     watcher.IncludeSubdirectories = true; 
     watcher.NotifyFilter = NotifyFilters.LastWrite; 
     watcher.EnableRaisingEvents = true; 

     // i cannot convert this line in c++/cli 
     watcher.Changed += (s, e) => onChange(s, e, customArg); 

     Console.Read(); 
    } 

es ist mein Code in C++/cli

void FileWatcher::onChanged(Object^ source, FileSystemEventArgs^ e, String^ customArg) 
{ 
    Console::WriteLine(e->FullPath); 
    Console::WriteLine(customArg); 
} 

int main(int argc, char* argv[]) 
{ 
    FileSystemWatcher watcher->Path = "G:\\"; 
    watcher->IncludeSubdirectories = true; 
    watcher->NotifyFilter = static_cast<System::IO::NotifyFilters> (NotifyFilters::LastWrite); 

    String^ customArg = gcnew String("myArg"); 

    // this line not compile 
    watcher->Changed += (s, e) = > onChange(s, e, customArg); 
    // 
} 

ich habe versucht, Lambda-Funktion wie diese

watcher->Changed += [](Object^ s, FileSystemEventArgs^ e, String^ c) -> void { OnChange(s, e, c); }; 

aber es funktioniert nicht, wahrscheinlich falsch

012 tun zu verwenden,
+0

Nach http://stackoverflow.com/questions/2777445/lambda-expressions-as-clr-net-delegates-event-handlers-in-visual-c-2010 Sie einen Lambda nicht zuweisen als Delegierter –

Antwort

1

Es scheint, dass Sie dies nicht über ein Lambda tun können, also müssen Sie eine Klasse erstellen, die als Ereignishandler fungiert, etwas ähnliches.

#using <System.dll> 

using namespace System; 
using namespace System::IO; 

void GlobalOnChanged(Object^ source, FileSystemEventArgs^ e, String^ customArg) 
{ 
    Console::WriteLine(e->FullPath); 
    Console::WriteLine(customArg); 
} 

public ref class Invoker 
{ 
public: 
    Invoker(String^ customArg) : customArg_(customArg) 
    { 

    } 
    void OnChanged(Object^ source, FileSystemEventArgs^ e) 
    { 
     GlobalOnChanged(source, e, customArg_); 
    } 

private: 
    String^ customArg_; 
}; 

int main(int argc, char* argv[]) 
{ 
    FileSystemWatcher^ watcher = gcnew FileSystemWatcher; 
    watcher->Path = "C:\\"; 
    watcher->IncludeSubdirectories = true; 
    watcher->NotifyFilter = static_cast<System::IO::NotifyFilters> (NotifyFilters::LastWrite); 
    String^ customArg = gcnew String("myArg"); 
    watcher->Changed += gcnew FileSystemEventHandler(gcnew Invoker(customArg), &Invoker::OnChanged); 
} 
+0

danke es funktioniert !!!, – rbglobal

+0

Beachten Sie, dass, wenn Sie ein Lambda in C# schreiben, der C# -Compiler etwas * sehr * ähnliches erzeugt. Die Klasse "Invoker" würde Felder für die zusätzlichen Parameter haben, die an diese Methode übergeben werden müssen, wie hier gezeigt, und für die Methode, die ebenfalls aufgerufen wird. –

+0

@David Ich dachte, du wärst verrückt, nicht nur Lambda Capture von customArg zu machen. Es stellt sich heraus, dass in C++/cli keine verwalteten lambdas existieren. Riesiges Loch in der Sprache. – tukra

Verwandte Themen