Általános delegate-k létrehozása, és használata (generic delegates)
Kászíthetünk általános Action delegate-t ("new Action"), amelyet átadhatunk egy Ruby blokknak, lamdának, vagy Proc-nak:
>>> require 'System'
=> true
>>> require 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
=> true
>>> my_action = System::Action.new { puts "Howdy!" }
=> System.Action
>>> my_action.invoke
"Howdy!"
=> nil
Lehetőség van készíteni általános delegate Action-t paraméterrel (vagy paraméterekkel):
>>> my_action = System::Action.of(System::String).new { |name| puts "Howdy, #{name}!" }
=> System.Action`1[System.String]
>>> my_action.invoke "Ryan"
Howdy, Ryan!
=> nil
Vagy használhatja a Ruby típusát is:
>>> my_action = System::Action.of(String).new { |name| puts "Howdy, #{name}!" }
=> System.Action`1[IronRuby.Builtins.MutableString]
>>> my_action.invoke "Ryan"
Howdy, Ryan!
=> nil
Func delegatek hasonlóan működnek:
>>> my_func = System::Func.of(String, String).new { |name| "Howdy, #{name}!" }
=> System.Func`2[IronRuby.Builtins.MutableString,IronRuby.Builtins.MutableString]
>>> result = my_func.invoke "Ryan"
=> "Howdy, Ryan!"
Az alábbi példában egy lambdának adjuk át az Action-t, majd a lamdát System.Func -ra konvertáljuk egy LINQ metódusban:
>>> my_func = lambda { |name| "Howdy, #{name}!" }
=> #
>>> result = my_func.call "Ryan"
=> "Howdy, Ryan"
>>> names = System::Collections::Generic::List.of(String).new
=> []
>>> names.add "Ryan"
=> nil
>>> names.add "Jimmy"
=> nil
>>> names.add "Ivan"
=> nil
>>> query = System::Linq::Enumerable.method(:select).of(String, String).call(names, System::Func.of(String, String).new(my_func))
=> System.Linq.Enumerable+WhereSelectListIterator`2[IronRuby.Builtins.MutableString,IronRuby.Builtins.MutableString]
>>> greetings = System::Linq::Enumerable.method(:to_list).of(String).call(query)
=> ["Howdy, Ryan!", "Howdy, Jimmy!", "Howdy, Ivan!"]