2010-08-30 10 views
7

¿Hay alguna manera en C# de hacer referencia a un constructor de clase como una función estándar? La razón es que Visual Studio se queja de modificar funciones con lambdas en ellas, y a menudo es una simple instrucción de selección.Constructor de llamadas como una función en C#

Por ejemplo var ItemColors = selectedColors.Select (x => new SolidColorBrush(x));, donde selectedColors es solo IEnumerable<System.Windows.Media.Color>.

Técnicamente hablando, ¿no debería ser redundante el lambda? select toma una función que acepta un tipo T y un tipo que regresa U. El pincel de color sólido toma (el correcto) tipo T aquí y devuelve una U. Solo que no veo forma de hacerlo en C#. En F # sería algo así como let ItemColors = map selectedColors (new SolidColorBrush).

TL; DR: Supongo que estoy buscando la forma válida de var ItemColors = selectedColors.select (new SolidColorBrush) que no requiere una lamba. ¿Es esto posible en C# o el lenguaje no tiene forma de expresar este constructo?

Respuesta

6

No, no puede hacer referencia a un constructor C# como un grupo de métodos y pasarlo como un parámetro de delegado. La mejor forma de hacerlo es a través de la sintaxis lambda en su pregunta.

0

No estoy seguro de que te haya entendido correctamente. ¿Pero estás hablando de un factory?

De esta manera puede pasar un valor a la fábrica y creará una instancia para usted.

SolidColorBrush brush = ColorBrushFactory.BrushFrom(color); 

Espero que esto ayudó.

+0

Está tratando de crear una instancia de un delegado Héctor normal. – SLaks

6

Se podría diseñar un método formal:

private static SolidColorBrush Transform(Color color) 
{ 
    return new SolidColorBrush(color); 
} 

continuación, puede utilizar Select así:

var ItemColors = selectedColors.Select(Transform); 
+0

+1, Este es un patrón de construcción que últimamente me ha gustado bastante, especialmente para la inmutabilidad falsa, y en las clases base que invocan métodos en sus implementadores desde el Create() estático. –

Cuestiones relacionadas