c# - example - Método de extensión que extiende T-¿mala práctica?
c# xml comments (2)
Bueno, hay realmente dos puntos aquí:
1) ¿Es una buena idea crear un método de extensión con this T
para que se aplique a todos los tipos?
2) ¿Es útil el método de extensión particular descrito?
Para la primera pregunta, la respuesta es a veces, pero depende del contexto. Puede hacer que un método de extensión se aplique a todas las clases al igual que lo hace linq, lo que garantiza que elija un espacio de nombres adecuado. Creo que crear este tipo de método de extensión dentro del espacio de nombres del Sistema es una mala idea, pero si estuviera más orientado, tal vez sería útil.
Para el segundo puesto que la invocación es inmediata, la elección de sintaxis es la siguiente:
int res = other.InvokeFunc<Other, int>(Callback);
var res2 = (new Func<Other, int>(Callback))(other);
var res3 = Callback(other);
Observando eso, entonces una simple llamada al método que pasa la instancia es más natural y típica, sin embargo, si su método de extensión se vuelve más elaborado, vuelvo a mi primer punto en el sentido de que depende del contexto (lo que podría ayudar con la encapsulación). .
He leído que generalmente es una mala práctica extender System.Object, con lo que estoy de acuerdo.
Sin embargo, tengo curiosidad, si lo siguiente se consideraría un método de extensión útil, ¿o sigue siendo una mala práctica?
Es similar a extender System.Object pero no exactamente,
public static R InvokeFunc<T, R>(this T input, Func<T, R> func)
{
return func.Invoke(input);
}
Básicamente, esto permite que cualquier objeto invoque cualquier función que tome ese objeto como parámetro y devuelva R, ya sea que esa función pertenezca o no al objeto. Creo que esto podría facilitar una "inversión de control" interesante, pero no estoy seguro de ello en general.
¿Pensamientos?
Todo lo que hace es que le da la posibilidad de referirse a un método como un parámetro que de hecho es lo que los delegates ya le permiten en C #.
No veo que sea más útil (en caso de IoC) que un delegado de tipo Func<T,R>
en su caso. Es solo otra forma de invocarlo.
ACTUALIZAR
Como se mencionó en los comentarios, creo que este método solo le ayuda a crear delegados de manera más eficiente. Pero de cualquier manera, no utilizas más el delegado creado, ya que lo invocas de inmediato. Así que un método de extensión como este tendría más sentido para mí:
public static Func<R> InvokeFunc<T, R>(this T input, Func<T, R> func)
{
return () => func(input);
}