2011-08-12 22 views
7

Tengo un diccionario DICOM que contiene un conjunto de objetos derivados de DataElement. El diccionario tiene un int como clave y DataElement como propiedad. Mi diccionario DICOM contiene una esta propiedad [] donde puedo acceder al DataElement, así:¿Puedo tener una propiedad genérica this []?

public class DicomDictionary 
{ 
    Dictionary<int, DataElement> myElements = new Dictionary<int, DataElement>(); 
    . 
    . 
    public DataElement this[int DataElementTag] 
    { 
    get 
    { 
     return myElements[int]; 
    } 
    } 
} 

Un problema ahora es que tengo diferentes tipos DataElement todos los derivados de DataElement, como DataElementSQ, DataElementOB y así sucesivamente. Lo que quería hacer ahora es lo siguiente para hacer la escritura en C# un poco más fácil:

public T this<T>[int DataElementTag] where T : DataElement 
{ 
    get 
    { 
     return myElements[int]; 
    } 
} 

Pero esto no es realmente posible. ¿Hay algo que me he perdido? Por supuesto que podría hacerlo con el método Getter, pero sería mucho mejor tenerlo de esta manera.

+1

No puede tener propiedades genéricas (incluidos los indexadores) http://stackoverflow.com/questions/494827/why-it-is-not-posible-to-define-generic-indexers-in-net –

+0

Ya sea que lo creas o no, lo que sugieres hacer sería confuso para usar y leer, imo. – Marc

Respuesta

3

¿Por qué no utilizar un método genérico real GetDataElement<T> where T : DataElement en su lugar? Los indexadores genéricos no son compatibles con C#. ¿Por qué crees que en este caso un indexador es mejor que un método?

+0

Hola Danny, esto es lo que esperaba. El problema de tener un método getter, y de hecho, internamente, tengo dicho método es que hace que el código sea mucho más ilegible que tenerlo como este método abreviado. Por supuesto, si tengo que lanzarlo, entonces este tampoco es el caso. Es por eso que estaba buscando tal cosa. Actualmente puedo vivir con eso, pero esta pregunta vino a mi mente. – msedi

4

Las mejores opciones son utilizar un método genérico (en lugar de un indexador) o hacer que su clase sea genérica (en cuyo caso, el indexador estaría vinculado al tipo genérico de clase). Un indexador genérico como usted ha descrito no está permitido en C#.

+0

Hola, Reed, tienes razón, podría crear una clase genérica, pero intentaba no tener algo así, porque actualmente funciona sin una clase genérica. – msedi

+0

@msedi: Parte del problema, dado lo que muestra, es que el diccionario podría contener varios tipos: no tendría forma de garantizar la seguridad del tipo en su código actual (incluso si funcionó). Dicho eso, la especificación de C# no lo admite ... –

+0

@msedi: Si la clase en sí no sabe qué tipo debe devolver el indexador, ¿qué hace? Sería un mal diseño para la persona que llama saber el tipo y no la clase. Entonces, ¿cuál es exactamente tu caso de uso? ¿Vas a tener instancias de esta clase que solo tengan un subtipo único en ellas? ¿O esperaban tener una combinación de subtipos y confiar en el código de llamada para saber el tipo que se está obteniendo? Tu diseño parece un poco extraño en este momento ... – Chris

2

¿Es un caso para usted?

public class DicomDictionary<TElement> 
{ 
     Dictionary<int, TElement> myElements = new Dictionary<int, TElement>(); 
     public TElement this[int DataElementTag] 
     {  
       get  
       {  
       return myElements[int];  
       } 
     } 
} 
+0

Hola sllev, tal vez tengo que pensarlo. Veo que no hay otra manera, tal vez debería hacerlo como sugirió. – msedi

+0

Por qué no puede seguir con el método Get ...(), es más claro – sll

0

agregación en respuesta SLL es:

public class Acessor<TKey, TValue> 
    where TKey : IComparable 
    where TValue : class 
{ 
    Dictionary<TKey, TValue> myElements = new Dictionary<TKey, TValue>(); 

    public TValue this[TKey key] 
    { 
     get 
     { 
      return myElements[key]; 
     } 
     set 
     { 
      myElements.Add(key, value); 
     } 
    } 
} 

o sin cambiar la firma de clase:

public class Acessor 
{ 
    Dictionary<string, object> myElements = new Dictionary<string, object>(); 

    public object this[string key] 
    { 
     get 
     { 
      return myElements[key]; 
     } 
     set 
     { 
      myElements.Add(key, value); 
     } 
    } 
} 

y crear un método para analizar el tipo genérico:

public T Get<T>(string key) 
     where T : class 
    { 
     return (T)Convert.ChangeType(acessor[key], typeof(T)); 
    } 
+0

¿Por qué está utilizando 'object' en su segundo fragmento de código?Esto parece peor en todos los sentidos que el original que utilizó 'DataElement' ... – Chris

+0

Utilicé' object' para un uso genérico –

+0

No es lo suficientemente claro. – nyedidikeke

Cuestiones relacionadas