2011-07-11 11 views
6

Tengo un tipo especial de diccionario. No estoy seguro de cómo hacer esto exactamente, pero estoy buscando para hacer que el método get virtual, pero no el método set:Propiedades del indexador C# - ¿Hay alguna forma de virtualizar el método get y no el set?

public TValue this[TKey key] 
    { 
     get { ... } 
     set { ... } 
    } 

¿es posible y si es así cuál es la combinación correcta?

+0

¿Qué quieres conseguir con haciendo solo getter 'virtual'? Puede haber una mejor manera de hacer eso. –

+0

Solo estoy tratando de hacer posible extender mi "ReadOnlyDictionary". Debido a que es un diccionario de solo lectura, no soporto el método set (arroja una excepción), pero una clase extendida podría querer realizar trabajo adicional desde el método get, por lo tanto, podrían sobrescribirlo y modificarlo. –

+0

De lo que no debería tratar de hacer que el método "get" sea virtual, sino que tenga algún método virtual "OnGetCalled" y permita que la clase derivada lo anule. La clase derivada no podrá anular "obtener" (es decir, mediante la sugerencia de Mark) sin llamar a la versión Base, por lo que el método separado hará que el contrato sea explícito. –

Respuesta

12

No se puede hacer eso directamente - que tendría que añadir un método separado:

protected virtual TValue GetValue(TKey key) { ...} 

public TValue this[TKey key] 
{ 
    get { return GetValue(key); } 
    set { ... } 
} 
+1

+1 por vencerme por 10 segundos –

+0

No importa, mi culpa. Lo siento. La solución que tenía en mente obviamente hizo que el colocador fuera privado. Aún así, si la colección es de solo lectura, no veo el problema en eso, pero es una solución diferente. – InBetween

6

Lo sentimos ... no hay sintaxis para hacer esto en C#, pero se puede hacer esto en su lugar .

public TValue this[TKey key] 
{ 
    get { return GetValue(key) } 
    set { ... } 
} 

protected virtual TValue GetValue(TKey key) 
{ 
    ... 
} 
0

estoy asumiendo lo que estamos tratando de hacer aquí es crear una situación en la que tienen que definir cómo se lee la propiedad, pero no cómo se establece la propiedad?

Esto me parece una mala idea. Podría tener una configuración que establezca el valor de _myVar pero el desarrollador final construya un getter que indique _someOtherVar. Dicho esto, no sé cuál es tu caso de uso, por lo que es muy probable que me esté perdiendo algo.

De todos modos, creo que esta pregunta antes podría ayudar: Why is it impossible to override a getter-only property and add a setter?

1

que podría estar mal entendido algo, pero si su Dictionary va a ser sólo lectura usted tiene que aplicar una envoltura para asegurarse de que es realmente readony (propiedad indizada del diccionario no es virtual de lo que no puede anular su comportamiento), en cuyo caso se puede hacer lo siguiente:

public class ReadOnlyDictionary<TKey, TValue> 
{ 
    Dictionary<TKey, TValue> innerDictionary; 

    public virtual TValue this[TKey key] 
    { 
     get 
     { 
      return innerDictionary[key]; 
     } 
     private set 
     { 
      innerDictionary[key] = value; 
     } 
    } 
} 
Cuestiones relacionadas