Search code examples
c#dynamicdelegatesanonymous-delegates

"dynamic" for anonymous delegates?


I wonder if there is a possibility to make the "dynamic" type for variables work for anonymous delegates.

I've tried the following:

dynamic v = delegate() {
};

But then I got the following error message:

Cannot convert anonymous method to type 'dynamic' because it is not a delegate type

Unfortunately, also the following code doesn't work:

Delegate v = delegate() {
};
object v2 = delegate() {
};

What can I do if I want to make a Method that accepts any type of Delegate, even inline declared ones?

For example:

class X{
    public void Y(dynamic d){
    }
    static void Main(){
        Y(delegate(){});
        Y(delegate(string x){});
    }
}

Solution

  • This works, but it looks a little odd. You can give it any delegate, it will run it and also return a value.

    You also need to specify the anonymous method signature at some point in order for the compiler to make any sense of it, hence the need to specify Action<T> or Func<T> or whatever.

    Why can't an anonymous method be assigned to var?

        static void Main(string[] args)
        {
            Action d = () => Console.WriteLine("Hi");
            Execute(d); // Prints "Hi"
    
            Action<string> d2 = (s) => Console.WriteLine(s);
            Execute(d2, "Lo"); // Prints "Lo"
    
            Func<string, string> d3 = (s) =>
            {
                Console.WriteLine(s);
                return "Done";
            };
            var result = (string)Execute(d3, "Spaghettio"); // Prints "Spaghettio"
    
            Console.WriteLine(result); // Prints "Done"
    
            Console.Read();
        }
    
        static object Execute(Delegate d, params object[] args)
        {
            return d.DynamicInvoke(args);
        }