2009-03-16 14 views
7

No estoy hablando de clases genéricas que declaran propiedades o campos con el tipo de un parámetro genérico. Estoy hablando de propiedades genéricas que podrían aplicarse a clases genéricas y no genéricas.¿Crees que las propiedades genéricas serían útiles en .NET?

No estoy hablando acerca de esto:

public class Base<T> 
{ 
    public T BaseProperty { get; set; } 
} 

estoy hablando de esto:

public class Base 
{ 
    public T BaseProperty<T> 
    { 
     get 
     { 
      // Insert magic 
     } 
     set 
     { 
      // Insert magic 
     } 
    } 
} 

O esto:

public class Base<U> 
{ 
    public T BaseProperty<T> 
    { 
     get 
     { 
      // Insert magic 
     } 
     set 
     { 
      // Insert magic 
     } 
    } 

    public U OtherBaseProperty { get; set; } 
} 

El uso sería algo como esto :

var b = new Base(); 
b.BaseProperty<int> = 42; 
int i = b.BaseProperty<int>; 
b.BaseProperty<string> = "Hi"; 
string s = b.BaseProperty<string>; 

O para el segundo ejemplo:

var b = new Base<string>(); 
b.BaseProperty<int> = 42; 
int i = b.BaseProperty<int>; 
b.OtherBaseProperty = "Hi"; 
string s = b.OtherBaseProperty; 

El // Introducir mágico se refiere a la manipulación de cada llamada a la getter propiedad genérica o setter que tiene un tipo diferente para el parámetro de tipo.

Por ejemplo esto:

b.BaseProperty<int> = 42; 

necesita ser manejado de manera diferente a:

b.BaseProperty<string> = "Hi"; 

Me prever que para cada tipo T si el captador se llama antes de la incubadora se llama entonces por defecto (T) es devuelto. Cuando se llama al colocador, el valor se almacena por tipo T de modo que cuando se llama posteriormente al extractor, se devuelve el valor anterior que se estableció para ese tipo.

Tenga en cuenta que bajo las propiedades de las cubiertas son solo métodos.

¿Crees que esto sería útil?

+0

No, no parece tan útil. Si necesito una propiedad int, haré una. Si necesito una propiedad de cadena, haré una. Bastante simple. –

Respuesta

10

He tenido un par de ocasiones en las que me hubiese gustado la posibilidad de hacerlo, sí.

Sin embargo, la sintaxis involucrada sería bastante fea, y es bastante rara vez útil que creo que prefiero simplemente aspirar e ir con métodos genéricos.

+0

De hecho, ha habido una o dos veces cuando hubiera sido útil. Le pregunté a Mads Torgersen @ MS sobre esto una vez y él básicamente dijo, "¿Por qué querrías hacer eso?" En otras palabras, los casos extremos no son lo suficientemente convincentes. – core

+0

Este tipo de propiedades se pueden implementar usando rasgos: http://scg.unibe.ch/Research/Rotor/index.html, desafortunadamente para .Net nunca lo salieron de la investigación ... –

+0

Gracias Jon. Estoy disfrutando mucho tu libro por cierto. Anoche estaba leyendo sobre genéricos y tuve esta idea. –

1

Sin un caso de uso mortal, no. Ya puede lograr lo mismo con un par de métodos genéricos, en caso de que lo necesite.

0

Si por alguna extraña razón se decidió que lo quería, se podía clasificar de la misma falsa con métodos:

public class Thing 
{ 
    Dictionary<Type, object> xDict = new Dictionary<Type,object>(); 
    public void set_X<T>(T x) 
    { 
     xDict[typeof(T)] = x; 
    } 
    public T get_X<T>() 
    { 
     return (T)xDict[typeof(T)]; 
    } 
} 

por las que se desee es una cuestión totalmente diferente, sin embargo. Por lo general, tiene más sentido comenzar con algo que desea hacer que de alguna manera que desee hacerlo.

1

No.

métodos genéricos tienen sentido, porque encarnan alguna operación (genérico) que sensiblemente se puede aplicar a diferentes tipos.

Pero las propiedades solo tienen sentido como valores con nombre único con contenido definido. Las "propiedades genéricas", como usted sugiere, realmente solo equivale a propiedades de nombre similar con diferentes firmas y contenido diferente.

1

Aquí hay un ejemplo en el que hubiera sido útil para mí, si hubiera sido posible.

var settings = new Settings(); 
int timeout = settings<int>["CacheInMinutes"]; 

Donde Configuración carga un archivo XML de variables de configuración.

que, comparado con:

var settings = new Settings(); 
int timeout = int.Parse(settings["CacheInMinutes"]); 

Realmente no hay mucho de una diferencia, pero bueno, todavía habría preferido que el indexador genérico.

+0

Sí, pero "int timeout = settings.Get (" CacheInMinutes ");" es tan escueto, y no requiere cambio/adición de idioma para implementar. – Chris

+0

Bueno. Los indexadores se ven como un buen caso de uso: Session ["CurrentUser"] = new User(); ... var user = Session ["CurrentUser"]; –

1

Bueno, tengo la situación que necesita propiedad genérica en la clase no genérica.

Ejemplo que tiene IComponent clase que desea proporcionar su padre IContainer con la propiedad Parent, ya que el componente puede pertenecer a cualquier tipo de contenedor. por lo que necesita para proporcionar propiedad genérica en lugar de método genérico

Component c = new Component(); 
Container p = new Container(); 
p.Add(c); 

y luego se accede a su matriz usando propiedad genérica (No aplica ahora)

c.Parent.ContainerProperty; 
c.Parent.ContainerMethod(); 

lugar utilizando el método detallado como

c.Parent().ContainerProperty; 
c.Parent().ContainerMethod(); 

Bueno, en este caso la propiedad genérica es más hermosa y tiene sentido, ya que no necesita ingresar ningún argumento.

Cuestiones relacionadas