c# - polimorfico - Clase parcial vs Método de extensión
metodos y funciones en c# (9)
No tengo mucha experiencia en el uso de estas 2 formas de extender una clase o crear métodos de extensión en contra de una clase. Al ver que otros trabajan, tengo una pregunta aquí.
Vi personas usando una clase parital para extender una clase de entidad en un proyecto. Mientras tanto, en el mismo proyecto, hay otra carpeta que contiene muchos métodos de extensión para la clase de entidad.
¿Es correcto hacerlo? Me refiero a que estas 2 formas funcionan bien. ¿Podría darme alguna práctica real sobre cómo elegir uno de ellos cuando quiero extender una clase?
Algunas de las diferencias que determinarán si desea usar una Clase parcial o un Método de extensión son
Clase parcial
- Solo funciona contra clases en el mismo proyecto / ensamblaje
- La clase objetivo debe marcarse como parcial
- Tiene acceso a los campos de la clase Target y a los miembros protegidos
- El objetivo debe ser una implementación de clase
Método de extensión
- Se puede aplicar contra clases en otros ensambles
- Debe ser estático, solo tiene acceso a los miembros públicos de las clases Target
- El objetivo de la extensión puede ser un tipo concreto, o un tipo abstracto o interfaz
Las clases parciales se deben usar en escenarios de generación de código.
Como el archivo generado puede sobreescribirse en cualquier momento, uno usa clases parciales para escribir en el archivo no generado.
Además, los parciales solo funcionarán si son parte del mismo ensamblaje: no pueden cruzar los límites del ensamblaje.
Si estas no son sus limitaciones, puede y debe usar métodos de extensión, por supuesto, después de considerar otras posibilidades, como la herencia y la composición, para determinar su idoneidad.
Parcial funciona solo si ambos archivos están en el mismo proyecto y puede acceder a miembros privados y protegidos de esa clase.
Los métodos de extensión son solo métodos estáticos y no pueden acceder a miembros privados.
Entonces, si desea acceder a miembros privados y protegidos, la única manera que tiene es parcial, si no, responder a la pregunta, ¿debería el método que desea agregar estar visible en cualquier lugar donde quiera usar la clase? en caso afirmativo, utilice parcial, si no, es algún tipo de extensión, use métodos de extensión.
Por cierto, si la primera clase no está generada por alguna herramienta, puedes escribir tu función allí excepto usar parcial;)
espero que esto ayude
Puede usar métodos de extensión en una instancia NULL pero no en métodos de instancia (de clases parciales o de otro modo). Esto es una consecuencia de los métodos de extensión que en realidad son estáticos.
Si elige la ruta de Clase parcial pero descubre que está repitiendo el mismo código, cambie a Métodos de extensión.
Por ejemplo, tengo muchas clases generadas con métodos que devuelven datos de IEnumerable<Track>
. Quiero extender cada clase de alguna manera para darme la opción de recibir los datos en el formato IEnumerable<MediaItem>
.
Tengo aquí un requisito general para transformar IEnumerable<Track>
datos en IEnumerable<MediaItem>
. En este caso, en lugar de escribir múltiples métodos de partial class
, un método de extensión funciona mejor:
public static class ExtensionMethods
{
public static IEnumerable<MediaItem> ToMediaItems(this IEnumerable<Track> tracks)
{
return from t in tracks
select new MediaItem
{
artist = t.Artist,
title = t.Title,
// blah blah
};
}
}
Esto me da las siguientes opciones:
var data = Playlist.Tracks.ToMediaItems();
var data = Podcast.Tracks.ToMediaItems();
// etc..
Una clase parcial es útil cuando desea extender una clase generada. De esta forma puede escribir su código en un archivo, y luego cuando / si la otra ''parte'' de su clase necesita ser regenerada, puede hacerse de manera segura, ya que el archivo de código no ha cambiado.
Utilizo métodos parciales cuando necesito una clase para implementar una interfaz, pero el código de clase se autogenera (VS utiliza clases parciales para generar código para ambos servicios web y modelos EF).
Utilizo métodos de extensión cuando el nuevo método que estoy agregando al tipo es apropiado para cualquier valor de ese tipo. (buenos ejemplos: int.IsEven (), string.IsEmpty (); malos ejemplos: int.IsOldEnoughToDrive (), string.IsLastName ()).
puede usar clases parciales en un proyecto que está desarrollando, mientras que los métodos de extensión también se pueden usar para extender proyectos, también no tiene el código fuente.
Partial Class -
dividir la definición de una clase o una estructura, o una interfaz sobre dos o más archivos fuente
Extension Method
Los métodos de extensión le permiten "agregar" métodos a tipos existentes sin crear un nuevo tipo derivado, recompilar o modificar el tipo original