C#: acceso al Diccionario mediante el uso de una clase parcial

0

Pregunta

Estoy tratando de acceder a un Diccionario de la siguiente manera, mediante el uso de una clase parcial. La finalidad de esto es para exponer este diccionario y de permitir que los diferentes métodos directamente de lectura/escritura de/a.

FilenameABC.cs ha dicho código, que parece estar bien, para mí hasta ahora:

namespace Namespace1
{
    partial class ClassA
    {
        public class ExampleDictionary
        {
            private Dictionary<int, string> _dict;

            public ExampleDictionary()
            {
                _dict = new Dictionary<int, string>();
            }
        }
    }
}

FilenameDEF.cs tiene este código y aquí es donde estoy teniendo dificultades. No estoy seguro de por qué la .Agregar métodos no funcionan. En el primero estoy tratando de utilizar sólo después de la creación de una instancia de la ExampleDictionary clase, que parece ser bastante contra intuitivo (dado mi nivel actual de conocimiento, por supuesto). En el segundo, estoy tratando de agregar elementos desde dentro de un método, que es

namespace Namespace1
{
    partial class ClassA
    {
        ExampleDictionary instanceOfDict = new ExampleDictionary();
        instanceOfDict.Add(1, "Test1"); // This does not work

        public static void FunctionA()
        {            
            for (int i = 0; i < 10; i++)
            {
            string text = $"Test{i}";
            instanceOfDict.Add(i, text); // This does not work as well              
            }          
        }
    }
}

Podría alguien ayudar, por favor?

2
1

El método estático FunctionA no puede tener acceso a instancia de los miembros de ClassA.

Cambiar FunctionA a no ser estática o hacer que el diccionario de campo estático.

2021-11-22 16:28:57
1

Aún no termino de decir lo que está tratando de hacer. Pero voy a hacer mi mejor esfuerzo para mostrar algunas cosas.

Estoy tomando esta frase que has escrito: "La finalidad de la presente es para exponer este diccionario y de permitir que los diferentes métodos directamente de lectura/escritura de/a." como mi guía

Parcial De La Clase De Problemas

Como he mencionado en los comentarios: no hay tal cosa como una Clase Parcial. La palabra clave partial simplemente indica que una clase puede ser definida en más de un archivo. La definición de reglas para la clase sigue siendo la misma, es sólo que algunos de los miembros de la clase puede ser definida en un archivo y otras partes en otros archivos.

Los problemas que están teniendo aquí tienen nada que ver con la partial la palabra clave.

Sus Dos // Esto no funciona Notas

El primero se parece a esto:

partial class ClassA
{
    ExampleDictionary instanceOfDict = new ExampleDictionary();
    instanceOfDict.Add(1, "Test1"); // This does not work
    //other code
}

La primera línea declara miembro privado campo de ClassA nombre instanceOfDict y lo inicializa. Es por eso que se compila.

La segunda línea intenta poner ejecutable de código (una llamada a la función) directamente en la parte superior del nivel de alcance de una clase. Usted no puede hacer eso. Usted puede poner un montón de cosas en la parte superior del nivel de alcance de una clase (por ejemplo, campos, propiedades, métodos, delegados, las enumeraciones, las clases internas), pero no se puede poner el código allí.

El segundo problema tiene este aspecto:

public static void FunctionA()
{            
    for (int i = 0; i < 10; i++)
    {
        string text = $"Test{i}";
        instanceOfDict.Add(i, text); // This does not work as well              
    }          
}

Los acogedor es un static método. instanceOfDict es un campo privado de la clase, no declarados como static. Usted no puede referirse a una instancia a nivel de los miembros (métodos, propiedades, campos, ...) desde un método estático. Leer sobre el static la palabra clave.

La creación de una Clase que Selectivamente se Expone un Diccionario

Puesto que usted quiere hacer algo de diccionario de trabajo dentro de una clase, pero exponen a la fuera, me fui a todo cerdo y de hecho mi clase genérica en <TKey, TValue> para que funcione con los Diccionarios de cualquier tipo.

Yo también hecho en la aplicación de la Colección de Inicialización de Patrón , de modo que usted puede inicializar las instancias de la clase tal como era en un diccionario.

La Colección de Inicialización del Patrón, la clase debe hacer las cosas:

  1. Implementar IEnumerable o IEnumerable<T> (T puede ser de cualquier tipo, no sólo el tipo de recogida - usted puede incluso acaba de lanzar un NotImplementedException si no te importa)

  2. Incluye un método que parece public void Add (SomeType atLeastOneParameter). Usted puede tener más de una sobrecarga de Add si usted desea.

Así que, voy a empezar con este (tenga en cuenta que implementa IEnumerable<T>:

public partial class TestExposedDictionary<TKey, TValue> : IEnumerable<TValue>
{
    private readonly Dictionary<TKey, TValue> _theDictionary = new Dictionary<TKey, TValue>();

    public void Add(TKey key, TValue value)
    {
        _theDictionary.Add(key, value);
    }

    public IEnumerator<TValue> GetEnumerator()
    {
        foreach (var kvp in _theDictionary)
        {
            yield return kvp.Value;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

Eso es suficiente para hacer una clase en su mayoría ven como un diccionario (su probable que desee agregar alguna manera de obtener los datos, etc. Pero, eso depende de ustedes (usted probablemente querrá tener un indizador (en TKey) y un TryGetValue.

Pero, vamos a agregar algo más al azar que a la funcionalidad de la clase (poner esto en la parte superior del nivel de alcance de la clase):

    public int Count => _theDictionary.Count;

    public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
    {
        foreach (var kvp in _theDictionary)
        {
            yield return kvp;
        }
    }

Que le permitirá ver cómo muchas de las cosas están en su diccionario y permite iterar sobre los elementos (el KeyValuePairs) que el Diccionario de colecciones. Siéntase libre de añadir más características.

Finalmente, para probar esto...

public static void Test()
{
    var testDict = new TestExposedDictionary<int, string> {
        {1, "one" },
        {5, "five" },
        {8, "eight" },
        {10, "ten" },
        {105, "hundredFive" },
    };

    // I can call Add in the normal way as well:
    testDict.Add(300, "threeHundred");

    Console.WriteLine($"TestDict Count: {testDict.Count}");
    foreach (string s in testDict)
    {
        Console.WriteLine(s);
    }
}

Cuando ejecuto este código, me sale:

TestDict Count: 6
one
five
eight
ten
hundredFive
threeHundred

La división de este uso Parcial

No sé por qué usted desea utilizar partial class. Normalmente esto se hace para tener dos trozos de código que está editado y mantenido por personas diferentes (la típica razón es para Visual Studio plantillas/mágico mecanismo para mantener a un lado de la partial class y el programador de la otra.

Las reglas son bastante simples, que se limitó a declarar public partial class MyClass en dos archivos. Los dos archivos deben estar en el mismo proyecto (es decir, compilado en la misma Asamblea) y las clases deben ser en el mismo espacio de nombres. Una vez hecho eso, simplemente dividir el (nivel superior alcance) partes y piezas a través de los dos partial class las declaraciones.

En estos casos probablemente me divide de esta manera:

  • De un lado, yo pondría las dos funciones necesarias para implementar el declarado IEnumerator<TValue>:
    • public IEnumerator<TValue> GetEnumerator()
    • IEnumerator IEnumerable.GetEnumerator()
  • Por el otro lado, me gustaría poner todo lo demás:
    • El diccionario de la declaración y intialization
    • El otro enumerador: public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
    • public int Count => _theDictionary.Count;
    • public void Add(TKey key, TValue value)
2021-11-23 01:45:02

No puedo expresar lo agradecido que me siento por esto. Esto también me ayudó a romper algunos conceptos erróneos que tenía. A veces aprender a programar pone un pero frustrante, pero por suerte hay increíbles personas como usted, que dedican una parte de su día a ayudar a los demás. Gracias de nuevo!
roccaforte

Sí, lo sé. Afortunadamente, me acaban de conseguir este distintivo que permite a mí como un recién llegado para empezar a operar con la moneda. :-)
roccaforte

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................