2008-12-11 11 views
13

Quiero crear un tipo de delegado en C# dentro de un método para el propósito de crear métodos anónimos.Creación de un tipo de delegado dentro de un método

Por ejemplo:


public void MyMethod(){ 
    delegate int Sum(int a, int b); 

    Sum mySumImplementation=delegate (int a, int b) {return a+b;} 

    Console.WriteLine(mySumImplementation(1,1).ToString()); 
} 

Desafortunadamente, no puedo hacerlo en .NET 2.0 y C# 2.0.

Respuesta

17

¿Por qué quiere crear el tipo de delegado en el método? ¿Qué hay de malo en declararlo fuera del método? Básicamente, no se puede hacer esto - no se puede declarar un tipo (cualquier tipo de tipo) dentro de un método.

Una alternativa sería declarar todos los delegados genéricos Func/acción que están presentes en .NET 3.5 - a continuación, sólo se podía hacer:

public void MyMethod(){ 
    Func<int, int, int> mySumImplementation = 
     delegate (int a, int b) { return a+b; }; 

    Console.WriteLine(mySumImplementation(1,1).ToString()); 
} 

Las declaraciones son en mi C#/.NET Versions page.

+8

"? ¿Por qué desea para crear el tipo de delegado dentro del método" - porque lo único que utiliza el tipo de delegado es una devolución de llamada definido dentro del método, por lo que la difusión de material que es conceptualmente local para el método fuera del método siente ... repulsivo. –

13

El delegado tipo tiene que ser definida fuera de la función. El delegado real se puede crear dentro del método como lo hace.

class MyClass { 
    delegate int Sum(int a, int b); 
    public void MyMethod(){ 

     Sum mySumImplementation=delegate (int a, int b) {return a+b;} 

     Console.WriteLine(mySumImplementation(1,1).ToString()); 
    } 

} 

sería válido. La mejor solución puede ser para emular .NET3.5, y crear algunos tipos de delegados genéricos a nivel mundial, que puede ser utilizado por toda la solución, para evitar tener que tipos de delegado constantemente redeclare para todo:

delegate R Func<R>(); 
delegate R Func<T, R>(T t); 
delegate R Func<T0, T1, R>(T0 t0, T1 t1); 
delegate R Func<T0, T1, T2, R>(T0 t0, T1 t1, T2 t2); 

A continuación, Sólo puede utilizar un delegado Func<int, int, int> en su código de seguridad.

4

Los delegados se compilan a clases (una clase que hereda de System.MulticastDelegate). En C#, no está permitido declarar una clase dentro de un método (consulte la especificación del lenguaje C#). Por lo tanto, tampoco puedes declarar un delegado en un método.

0

Qué tal esto:

static void Main(string[] args) 
{ 
    Expression<Func<int, int, int>> exFunc = (a, b) => a + b; 
    var lambda = exFunc as LambdaExpression; 
    Delegate del = exFunc.Compile(); 
    Console.WriteLine(del.DynamicInvoke(2, 2)); 
} 
Cuestiones relacionadas