TransWikia.com

Como acceder desde otra clase a una lista "private static List"?

Stack Overflow en español Asked by dobarqueiro on February 17, 2021

Tengo este codigo:

public static class GenDAO<T> where T : IEntidad // antes static
{
    private static List<T> BDenMemoria = new List<T>();
    private static int NextId = 1;

    public static int Crear(T entidad)
    {
        entidad.id = NextId++;
        BDenMemoria.Add(entidad);
        return entidad.id;
    }

    public static T Buscar(int id)
    {
        return BDenMemoria.FirstOrDefault(x => x.id == id);
    }

    public static void Actualizar(T entidad)
    {
        int indice = BDenMemoria.FindIndex(x => x.id == entidad.id);
        if (indice != -1)
            BDenMemoria[indice] = entidad;
    }

    public static void Eliminar(int id)
    {
        int indice = BDenMemoria.FindIndex(x => x.id == id);
        if (indice != -1)
            BDenMemoria.RemoveAt(indice);
    }
}

Es parte de una código para windows forms y necesito acceder desde la clase principal a la lista BDenMemoria que es private y static, para mostrar en un DataGridView los objetos que posee la lista. Pero no se como acceder a esa lista desde fuera.
Gracias!

4 Answers

Creo que la solución más sencilla es usando Reflection, ya que usando la clase FieldInfo, los BindingFlags correctos y su método GetValue nos bastaría para obtener la referencia a un campo private static

Por ejemplo..

//Obtengo el tipo de la clase estática..
Type type = typeof(GenDAO<TuEntidad>);
//Obtengo el objeto FieldInfo pasando el nombre del campo que pretendo obtener y los BindingFlags correspondientes.
FieldInfo info = type.GetField("BDenMemoria", BindingFlags.NonPublic | BindingFlags.Static);
//Por último con GetValue obtengo la referncia a la lista que buscamos..
object value = info?.GetValue(null);
//value tendrá adentro la lista BDenMemoria

Answered by Juan Salvador Portugal on February 17, 2021

Un miembro private sólo es accesible a través de miembro de la misma clase como se explica en la documentación:

El acceso privado es el nivel de acceso menos permisivo. Los miembros privados solo son accesibles dentro del cuerpo de la clase o el struct en el que se declaran.

La única manera de acceder directamente a la lista sería con por lo menos estas dos características:

  1. La clase no es estática.
  2. El modificador de acceso de la lista es protected.

Una manera indirecta de obtener la lista sería a través de una iteración con el método Buscar:

IList<IEntidad> BDenMemoria = new List<ClaseEntidad>();
int i = 0;
bool stop = false;
do
{
    IEntidad obj = GenDAO.Buscar(i);
    if (EqualityComparer<ClaseEntidad>.Default.Equals(obj, default(ClaseEntidad)))
    {
        stop = true;
    }
    else
    {
        BDenMemoria.Add(obj);
        i++;
    }
}
while (!stop);

Answered by Kroneaux Schneider on February 17, 2021

En el ejemplo que has puesto, la Lista BDenMemoria es de tipo static.

La siguiente definición aparece en la documentación de Microsoft:

El miembro estático es invocable en una clase, incluso si no se ha creado ninguna instancia de la clase. Siempre se tiene acceso al miembro estático con el nombre de clase, no con el nombre de instancia. Solo existe una copia de un miembro estático, independientemente del número de instancias de la clase que se creen.

Por lo que el acceso a la Lista se realiza directamente sin instanciar la clase.

GenDAO.BDenMemoria;

Si no puedes cambiar el modificador de acceso private, puedes añadir un método que haga de wrapper.

Answered by Carlos Alma on February 17, 2021

Pensaría que basta con volverla pública y agregar una instancia de tu clase en la clase donde la queres utilizar. Por ejemplo:

GenDAO ejemplo = new GENDAO();

Y luego accediendo a la propiedad usando:

var lista = ejemplo.BDenMemoria;

Las variables privadas se llaman así porque pertenecen a esa clase en específico y no debería de ser posible acceder a ellas desde afuera.

Espero te sirva, saludos!

Answered by Alex on February 17, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP