¿Cómo extiendo una clase con métodos de extensión de c#?


¿Se pueden aplicar métodos de extensión a la clase?

Por ejemplo, extender DateTime para incluir un método Tomorrow () que podría ser invocado como:

DateTime.Tomorrow();

Sé que puedo usar

static DateTime Tomorrow(this Datetime value) { //... }

O

public static MyClass {
  public static Tomorrow() { //... }
}

Para un resultado similar, pero cómo puedo extender DateTime para que pueda invocar DateTime.¿Mañana?

Author: stackuser83, 2009-07-27

9 answers

No puede agregar métodos a un tipo existente a menos que el tipo existente esté marcado como parcial, solo puede agregar métodos que parezcan ser un miembro del tipo existente a través de métodos de extensión. Dado que este es el caso, no puede agregar métodos estáticos al tipo en sí, ya que los métodos de extensión usan instancias de ese tipo.

No hay nada que te impida crear tu propio método de ayuda estático como este:

static class DateTimeHelper
{
    public static DateTime Tomorrow
    {
        get { return DateTime.Now.AddDays(1); }
    }
}

Que usarías así:

DateTime tomorrow = DateTimeHelper.Tomorrow;
 64
Author: Andrew Hare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-07 22:46:06

Utilice un método de extensión .

Ex:

namespace ExtensionMethods
{
    public static class MyExtensionMethods
    {
        public static DateTime Tomorrow(this DateTime date)
        {
            return date.AddDays(1);
        }    
    }
}

Uso:

DateTime.Now.Tomorrow();

O

AnyObjectOfTypeDateTime.Tomorrow();
 162
Author: Kumu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-24 20:30:47

Los métodos de extensión son sugar sintáctico para hacer que los métodos estáticos cuyo primer parámetro es una instancia de tipo T se vean como si fueran un método de instancia en T.

Como tal, el beneficio se pierde en gran medida cuando se hacen 'métodos de extensión estáticos', ya que servirían para confundir al lector del código incluso más que un método de extensión (ya que parecen estar completamente calificados, pero no están realmente definidos en esa clase) para ninguna ganancia sintáctica (ser capaz de encadenar llamadas estilo dentro de Linq, por ejemplo).

Dado que tendría que traer las extensiones al ámbito con un uso de todos modos, argumentaría que es más simple y seguro crear:

public static class DateTimeUtils
{
    public static DateTime Tomorrow { get { ... } }
}

Y luego usa esto en tu código a través de:

WriteLine("{0}", DateTimeUtils.Tomorrow)
 16
Author: ShuggyCoUk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-27 13:53:22

Lo más cercano que puedo llegar a la respuesta es agregando un método de extensión a un objeto System.Type. No es bonito, pero sigue siendo interesante.

public static class Foo
{
    public static void Bar()
    {
        var now = DateTime.Now;
        var tomorrow = typeof(DateTime).Tomorrow();
    }

    public static DateTime Tomorrow(this System.Type type)
    {
        if (type == typeof(DateTime)) {
            return DateTime.Now.AddDays(1);
        } else {
            throw new InvalidOperationException();
        }
    }
}

De lo contrario, IMO Andrew and ShuggyCoUk tiene una mejor implementación.

 9
Author: Adrian Godong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-07 19:53:43

Haría lo mismo que Kumu

namespace ExtensionMethods
{
    public static class MyExtensionMethods
    {
        public static DateTime Tomorrow(this DateTime date)
        {
           return date.AddDays(1);
        }    
    }
}

Pero llámelo como esta nueva DateTime().Mañana();

Creo que hace más seens que DateTime.Ahora.Mañana();

 3
Author: mimo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-09 12:51:15

Proporcionan la capacidad de extender los tipos existentes agregando nuevos métodos sin modificaciones necesarias al tipo. Llamar a métodos desde objetos de tipo extendido dentro de una aplicación usando sintaxis de método de instancia se conoce como métodos "extending". Los métodos de extensión no son miembros de instancia en el tipo. El punto clave a recordar es que los métodos de extensión, definidos como métodos estáticos, están en el ámbito solo cuando el espacio de nombres se importa explícitamente en el código fuente de la aplicación a través de la directiva using. A pesar de que los métodos de extensión se definen como métodos estáticos, todavía se llaman usando sintaxis de instancia.

Consulte el ejemplo completo aquí http://www.dotnetreaders.com/articles/Extension_methods_in_C-sharp.net,Methods_in_C_-sharp/201

Ejemplo:

class Extension
    {
        static void Main(string[] args)
        {
            string s = "sudhakar";
            Console.WriteLine(s.GetWordCount());
            Console.ReadLine();
        }

    }
    public static class MyMathExtension
    {

        public static int GetWordCount(this System.String mystring)
        {
            return mystring.Length;
        }
    }
 3
Author: sudhakar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-23 05:05:46

Estaba buscando algo similar - una lista de restricciones en las clases que proporcionan Métodos de extensión. Parece difícil encontrar una lista concisa, así que aquí va:

  1. No puedes tener nada privado o protegido-campos, métodos, etc.

  2. Debe ser una clase estática, como en public static class....

  3. Solo los métodos pueden estar en la clase, y todos deben ser estáticos públicos.

  4. Usted no puede tener métodos estáticos convencionales - los que no incluyen un este argumento no está permitido.

  5. Todos los métodos deben comenzar:

    Public static ReturnType methodName (this className _this, ...)

Así que el primer argumento es siempre esta referencia.

Esto crea un problema implícito: si agrega métodos que requieren un bloqueo de cualquier tipo, realmente no puede proporcionarlo a nivel de clase. Por lo general, proporcionarías un bloqueo privado a nivel de instancia, pero no es posible agregar ningún campo privado, lo que te deja con algunas opciones muy incómodas, como proporcionarlo como una estática pública en alguna clase externa, etc. Se pone arriesgado. Signos el lenguaje C# tuvo un mal giro en el diseño de estos.

La solución es usar su clase Extension Method como solo una Fachada a una clase regular, y todos los métodos estáticos en su clase Extension simplemente llaman a la clase real, probablemente usando un Singleton.

 3
Author: Chris Moschini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:40:33

Desafortunadamente, no puedes hacer eso. Creo que sería útil, sin embargo. Es más natural escribir:

DateTime.Tomorrow

Que:

DateTimeUtil.Tomorrow

Con una clase Util, debe verificar la existencia de un método estático en dos clases diferentes, en lugar de una.

 2
Author: Meta-Knight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-15 12:53:20

Hemos mejorado nuestra respuesta con una explicación detallada.Ahora es más fácil de entender sobre el método de extensión

Extension method: Es un mecanismo a través del cual podemos extender el comportamiento de la clase existente sin usar la subclasificación o modificar o recompilar la clase o estructura original.

Podemos extender nuestras clases personalizadas, clases de. net framework, etc.

El método de extensión es en realidad un tipo especial de método estático que se define en la clase estática.

Como DateTime la clase ya está tomada arriba y por lo tanto no hemos tomado esta clase para la explicación.

A continuación se muestra el ejemplo

/ / Esta es una clase de calculadora existente que tiene solo un método (Add)

public class Calculator 
{
    public double Add(double num1, double num2)
    {
        return num1 + num2;
    }

}

// Below is the extension class which have one extension method.  
public static class Extension
{
    // It is extension method and it's first parameter is a calculator class.It's behavior is going to extend. 
    public static double Division(this Calculator cal, double num1,double num2){
       return num1 / num2;
    }   
}

// We have tested the extension method below.        
class Program
{
    static void Main(string[] args)
    {
        Calculator cal = new Calculator();
        double add=cal.Add(10, 10);
        // It is a extension method in Calculator class.
        double add=cal.Division(100, 10)

    }
}
 0
Author: Sheo Dayal Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-25 10:45:00