.net - que - ¿Qué son los métodos de extensión?
que es un metodo de extension (9)
¿Qué son los métodos de extensión en .NET?
EDITAR: He publicado una pregunta de seguimiento en Uso de métodos de extensión
Los métodos de extensión permiten a los desarrolladores agregar nuevos métodos al contrato público de un tipo de CLR existente, sin tener que subclasificarlo o recompilar el tipo original.
Los métodos de extensión ayudan a combinar la flexibilidad del soporte "tipado de pato" popular en los lenguajes dinámicos actuales con el rendimiento y la validación en tiempo de compilación de los lenguajes fuertemente tipados.
Referencia: http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx
Aquí hay una muestra de un Método de extensión (observe la palabra clave this
delante del primer parámetro):
public static bool IsValidEmailAddress(this string s)
{
Regex regex = new Regex(@"^[/w-/.]+@([/w-]+/.)+[/w-]{2,4}$");
return regex.IsMatch(s);
}
Ahora, el método anterior se puede invocar directamente desde cualquier cadena, como esta:
bool isValid = "[email protected]".IsValidEmailAddress();
Los métodos agregados también aparecerán en IntelliSense:
texto alternativo http://www.scottgu.com/blogposts/extensionmethods/step1.jpg
Con respecto a un uso práctico para los Métodos de extensión, puede agregar nuevos métodos a una clase sin derivar una nueva clase.
Eche un vistazo al siguiente ejemplo:
public class Extended {
public int Sum() {
return 7+3+2;
}
}
public static class Extending {
public static float Average(this Extended extnd) {
return extnd.Sum() / 3;
}
}
Como puede ver, la clase Extending
agrega un método denominado promedio a la clase Extended
. Para obtener el promedio, llame al método average
, ya que pertenece a la clase extended
:
Extended ex = new Extended();
Console.WriteLine(ex.average());
Referencia: http://aspguy.wordpress.com/2008/07/03/a-practical-use-of-serialization-and-extension-methods-in-c-30/
Aquí está el ejemplo en VB.Net; observe el atributo Extensión (). Coloque esto en un Módulo en su proyecto.
Imports System.Runtime.CompilerServices
<Extension()> _
Public Function IsValidEmailAddress(ByVal s As String) As Boolean
If String.IsNullOrEmpty(s) Then Return False
Return Regex.IsMatch(email, _
"^([/w-/.]+)@((/[[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.)|(([/w-]+/.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(/]?)$")
End Function
Esta pregunta ya ha sido respondida, pero me gustaría agregar que es muy útil si tiene tipos que están dentro de otro proyecto y no desea volver a ese proyecto para agregar alguna funcionalidad. Estamos usando NHibernate y tenemos un proyecto para nuestra capa de persistencia de datos que los chicos quieren mantener limpio. Con el fin de obtener métodos adicionales agradables y reconocibles en esos objetos, pude usar métodos de extensión y realmente me alegraron el día.
Además, dado que nadie más lo ha publicado, aquí hay un buen artículo al respecto en MSDN: http://msdn.microsoft.com/en-us/library/bb383977.aspx
Los métodos de extensión son formas en que los desarrolladores pueden "agregar" métodos a objetos que no pueden controlar.
Por ejemplo, si desea agregar un método "DoSomething ()" al objeto System.Windows.Forms, ya que no tiene acceso a ese código, simplemente debe crear un método de extensión para el formulario con la siguiente sintaxis.
Public Module MyExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Sub DoSomething(ByVal source As System.Windows.Forms.Form)
''Do Something
End Sub
End Module
Ahora dentro de un formulario puede llamar "Me.DoSomething ()".
En resumen, es una forma de agregar funcionalidad a objetos existentes sin herencia.
Pensé que agregaría una explicación que es más conceptual y menos dependiente del código.
Imagine un Ford rodando fuera de la línea de construcción. No tiene acceso a la línea de construcción, pero desea que todos los autos de Ford puedan tener un alerón adicional agregado a la parte trasera del automóvil (se ve más frío cuando se exhibe). ¿Cómo vas a hacer eso? En el mundo de la informática, a menos que tenga acceso a la línea de construcción original dentro de una fábrica de Ford, no puede simplemente atornillar cosas al Ford. Bien, ahora puedes: INTRODUZCA métodos de extensión.
Ahora puedes hacer cosas como esta:
Ford hilux = new Ford();
hilux.DisplayRearFoiler(); // you can now do this even though you don''t have access to the Ford source code.
Tendrás que crear el método de extensión. Consulte las respuestas anteriores.
Quiero responder a los métodos de extensión en términos de una clase sellada .
Supongamos que tiene una clase sellada que contiene métodos vitales. Ahora quiere agregarle un nuevo método. Supongamos que esta clase viene en una DLL externa por lo que no puede agregarle un nuevo método. Qué harás ?
Toma otro ejemplo. Supongamos que la clase está integrada en su aplicación por su Project Manager o Security Guru. Puede editar esa clase solo tomando el permiso de su Project Manager o Security Guru.
Su solución puede ser eliminar la palabra clave sellada de esta clase y heredarla en otra clase. Luego, dentro de la subclase (que hereda esta clase) puede agregar su nuevo método.
Pero Espere -> No puede simplemente eliminar la Palabra clave Sellada, ya que esto puede comprometer la seguridad de toda la aplicación. Puedo apostarle que su PM o Security Guru nunca le dará ese permiso citando problemas de seguridad.
Entonces, ¿qué se puede hacer aquí?
La respuesta es métodos de extensión que se pueden agregar en una clase estática y ya no es necesario tocar la clase sellada.
Ejemplo:-
sealed class MyData
{
private double D1, D2, D3;
public MyData(double d1, double d2, double d3)
{ D1 = d1; D2 = d2; D3 = d3; }
public double Sum() { return D1 + D2 + D3; }
}
static class ExtendMyData
{
public static double Average(this MyData md)
{
return md.Sum() / 3;
}
}
Agregué un método público estático denominado Promedio a una nueva clase estática. Este método tiene el parámetro de la clase principal con la palabra clave ''this'' al frente.
Ahora, para llamar al método Average, utilizo el objeto de la clase primaria sellada y no la subclase.
MyData md = new MyData(3, 4, 5);
double exAverage = md.Average();
Espero que encuentres útiles los Métodos de extensión.
Un método de extensión es un "truco de compilación" que le permite simular la adición de métodos a otra clase, incluso si no tiene el código fuente para ello.
Por ejemplo:
using System.Collections;
public static class TypeExtensions
{
/// <summary>
/// Gets a value that indicates whether or not the collection is empty.
/// </summary>
public static bool IsEmpty(this CollectionBase item)
{
return item.Count == 0;
}
}
En teoría, todas las clases de colección ahora incluyen un método IsEmpty
que devuelve verdadero si el método no tiene elementos (siempre que haya incluido el espacio de nombres que define la clase anterior).
Si me he perdido algo importante, estoy seguro de que alguien lo señalará. (¡Por favor!)
Naturalmente, existen reglas sobre la declaración de los métodos de extensión (deben ser estáticos, el primer parámetro debe estar precedido por la palabra clave this
, etc.).
Los métodos de extensión en realidad no modifican las clases que parecen extenderse; en cambio, el compilador manipula la llamada a la función para invocar el método de manera adecuada en tiempo de ejecución. Sin embargo, los métodos de extensión aparecen correctamente en listas desplegables intellisense con un ícono distintivo, y puede documentarlos como lo haría con un método normal (como se muestra arriba).
Nota: Un método de extensión nunca reemplaza un método si ya existe un método con la misma firma.
¿Por qué estoy escribiendo otra respuesta?
Las respuestas anteriores son muy complejas. Supongo que si necesita preguntar qué es un método de extensión, realmente no sabrá lo que significa: (i) contratos públicos, (ii) CLR, (iii) tipos, (iv) subclase, ( v) pato-tipado, etc.
Métodos de extensión: explicación simple
Supongamos que tengo un perro. Todos los perros, todos los animales de tipo perro, hacen ciertas cosas:
- Comer
- Menea la cola
- Grita "¡Guau!"
- Shakes Paw, etc.
Las cosas que un perro puede hacer son llamadas "métodos".
Ahora supongamos que el Gran Programador en OO Heaven se olvidó de agregar un método a la clase de perro: FetchNewspaper.
Quieres poder decir:
rex.FetchNewspaper(); // or
wolfie.FetchNewspaper(); // or
beethoven.FetchNewspaper();
...... a pesar de que no tienes acceso al código fuente.
¿Cómo estás haciendo que tu perro haga eso?
Su única solución es crear un "método de extensión".
Creando un Método de Extensión
(Tenga en cuenta la palabra clave "this" delante del primer parámetro a continuación):
public static void FetchNewsPaper(this Dog familyDog)
{
ConsoleWriteline(“Goes to get newspaper!”)
}
Y si quieres que tu perro obtenga el periódico, simplemente haz esto:
Dog freddie_the_family_dog = new Dog();
freddie_the_family_dog.FetchNewspaper();
Si aún tiene preguntas, publique un comentario e intentaré explicarlo de nuevo.
Método de extensión en C #
¿Qué es el método de extensión?
Extension method means Class name and method name are having with Static Key word.
Método de extensión que usa la palabra clave "this" y Debe ser la primera firma es mencionar la dirección de identificación, este tipo es lo mismo para like,
cadena estática pública Meth ( esta cadena i, int j)
y
string res = "ae" .Meth (num);
La parte Negrita es la dirección de identificación. El espacio de nombres debe ser el mismo.
¿Por qué necesitamos la extensión?
Estamos utilizando la misma función en muchos lugares, después no pudimos encontrar por qué usamos aquí. Por esta razón, usa la identificación de la dirección. Estático significa instancia única. Esto solo puede acceder a la función miembro estática. ¿Incluso cómo acceder sin métodos de clase estáticos en la clase estática? Ejemplo: ver error de lanzamiento en el método "Sal",
clase estática Emp {public int Sal (int i, int j) {return i * j; }}
Acceda solo miembro estático. Y
El siguiente código con el que no podríamos crear objetos para clases no estáticas con clases estáticas. Entonces, ¿cómo acceder al método no estático en la clase estática? Por este motivo, seguimos el método de extensión sin herencia.
Por ejemplo, agregar o incluso funcionalidad usando el método de extensión aquí,
usando el sistema. Texto;
utilizando System.Threading.Tasks;
espacio de nombres Extension_Method {static class Program {
public static string Meth (this string i,int j)
{
if (j % 2 == 0)
{
return "Even";
}
else
{
return "ODD";
}
}
}
class program2
{
static void Main (string [] args)
{
Console. WriteLine ("Enter Integer");
int num = Convert.ToInt32(Console.ReadLine());
string res = "ae".Meth(num);
Console. WriteLine(res);
Console.ReadLine();
}
}
Resultado: