tipos objetos metodos funciones expresiones delegados anonimos anonimas c# anonymous-function anonymous-types

c# - objetos - ¿Cómo declara un Func con un tipo de retorno anónimo?



objetos anonimos c# (3)

Necesito poder hacer esto:

var getHed = () => { // do stuff return new { Property1 = value, Property2 = value2, etc...}; }; var anonymousClass = getHed();

Pero recibo un error que indica que necesito declarar explícitamente getHed.

¿Cómo declaro Func para que T sea el tipo anónimo que estoy devolviendo?

En caso de que tenga curiosidad sobre por qué debo hacer esto, es porque estoy usando un software de terceros que permite el código de personalización, pero solo dentro de un solo método. Esto puede llegar a ser muy difícil de manejar. Tuve la idea de que podía usar métodos anónimos para ayudar a mantener el código de procedimiento organizado. En este caso, para que lo ayude, necesito una nueva clase, que no puedo definir excepto de forma anónima.


Como es básicamente el caso de los tipos anónimos, la solución es usar un método genérico, para que pueda usar la inferencia de tipo de método:

public static Func<TResult> DefineFunc<TResult>(Func<TResult> func) { return func; }

Ahora puedes escribir:

var getHed = DefineFunc(() => { // do stuff return new { Property1 = value, Property2 = value2, etc...}; });


En resumen, no se puede hacer.

Necesita un método adicional, genérico, para engañar al compilador para que infiera la T para que sea del tipo anónimo, como lo proporcionan las otras respuestas aquí.

Sin embargo, ya que ha escrito que este es un caso especial donde todo tiene que encajar dentro de un solo método, entonces no, no se puede hacer.

El compilador no permite esta sintaxis:

var x = () => ...

Necesita esto:

DelegateType x = () => ...

Como tal, necesita engañar al compilador para que determine el tipo correcto para DelegateType , que probablemente sea Func<(anonymous type here)> , y esto solo puede hacerse a través de la inferencia de tipos.

Sin embargo, la inferencia de tipo y los parámetros genéricos requieren que el método sea genérico y, por lo tanto, la necesidad del método adicional que tiene que ser un método genérico para ayudar al compilador a hacer esta inferencia de tipo.

Ya que necesitas permanecer dentro de un método ...


Utilice el siguiente método genérico para permitir que el compilador infiera el tipo anónimo para usted:

public static Func<T> MakeFn<T>(Func<T> f) { return f; }

Uso:

var getHed = MakeFn(() => new { Property1 = ..., Property2 = ... }); var anonymousClass = getHed(); // you can now access Porperty1 and Property2 var test = anonymousClass.Porperty1;