2010-08-23 75 views
2

你可以做匿名函數在C#中像您可以在JavaScript:函數作爲參數傳遞給方法

的JavaScript:

var s = (function() 
{ 
    return "Hello World!"; 
}()); 

C#:

var s = new Func<String>(() => 
{ 
    return "Hello World!"; 
})(); 

...在JavaScript您可以傳遞函數以由其他函數執行。最重要的是;您可以將參數傳遞給執行的函數:

var f = function (message) // function to be executed 
{ 
    alert(message); 
}; 

function execute(f) // function executing another function 
{ 
    f("Hello World!"); // executing f; passing parameter ("message") 
} 

上述示例在C#中可能嗎?


更新

用例:我遍歷了一堆的數據庫,記錄特定的實體。在Log()Logger裏面,我不想打電話給我的第二個功能(F()),所以我想在課堂外撥打F()

...線沿線的東西:

public void F(String databaseName) 
{ 
} 

public class Logger 
{ 
    public void Log(Function f) 
    { 
     var databaseName = ""; 

     f(databaseName); 
    } 
} 

回答

6

絕對是 - 你只需要給方法的適當的簽名:

public void Execute(Action<string> action) 
{ 
    action("Hello world"); 
} 
... 
Execute(x => Console.WriteLine(x)); 

請注意,你必須指定具體的委託鍵入參數 - 例如,您不能僅將其聲明爲Delegate

編輯:你的數據庫的例子是完全一樣的 - 你想傳遞一個字符串,並沒有得到任何輸出,這正是Action<string>所做的。除非你想調用一個現有的方法(F()在你的代碼),你甚至不需要一個lambda表達式 - 您可以使用方法組轉換,而不是:

public void F(String databaseName) 
{ 
} 

public class Logger 
{ 
    public void Log(Action<string> f) 
    { 
     var databaseName = ""; 

     f(databaseName); 
    } 
} 

// Call it like this: 
Logger logger = new Logger(...); 
logger.Log(F); 
+0

更新了我的問題。你能再看一次嗎?也許會更精細些? – roosteronacid 2010-08-23 09:22:33

+0

@roosteronacid:我的例子正是你所需要的:'Action '委託本質上是一個委託,它接受一個字符串並作用於它,然後不返回任何東西......就像'F(string)'in你的榜樣。 – 2010-08-23 09:31:34

0

像:

var s = new Func<String, string>((string name) => 
{ 
    return string.Format("Hello {0}!", name); 
}); 

?根據您的更新部分

 var f = (Action<string>) 
       (x => 
        { 
         Console.WriteLine(x); 
        } 
       ); 

     var execute = (Action<Action<string>>) 
         (cmd => 
          { 
           cmd("Hello"); 
          } 
        ); 
     execute(f); 
1

你可以通過委託 你需要一個容器,讓您的功能

IList<Action<string>> actionList = new List<Action<Sstring>>(); 

在你的日誌()函數,你可以添加你F()到容器:

actionList.Add(F); 

然後在外面的某處調用函數:

foreach (Action<string> func in actionList) 
     { 
      func("databasename"); 
     } 
相關問題