C#: l'accès au Dictionnaire en utilisant une classe partielle

0

La question

Je suis en train d'essayer d'accéder à un Dictionnaire de la manière suivante, en utilisant une classe partielle. La finalité de cette opération est d'exposer ce dictionnaire et de permettre aux différentes méthodes de directement en lecture/écriture à partir de/vers elle.

FilenameABC.cs a ce code, qui semble être OK pour moi pour l'instant:

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

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

FilenameDEF.cs a ce code et c'est là que je vais avoir des difficultés. Je ne suis pas sûr pourquoi, la .Ajouter méthodes ne fonctionnent pas. Dans la première, je suis en train de l'utiliser juste après la création d'une instance de la ExampleDictionary classe, qui semble être tout à fait contre-intuitif (compte tenu de mon niveau actuel des connaissances, bien sûr). Dans la seconde, je suis en train d'ajouter des éléments à l'intérieur d'une méthode, qui est

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              
            }          
        }
    }
}

Quelqu'un pourrait-il l'aider, s'il vous plaît?

2
1

La méthode statique FunctionA ne peut pas accéder aux membres de l'instance de ClassA.

Modifier FunctionA non statique ou de rendre le champ de dictionnaire statique.

2021-11-22 16:28:57
1

Je n'ai pas encore tout à fait dire ce que vous essayez de faire. Mais je vais faire de mon mieux pour vous montrer quelques trucs.

Je prends cette phrase, vous avez écrit: "La finalité de cette opération est d'exposer ce dictionnaire et de permettre aux différentes méthodes de directement en lecture/écriture à partir de/vers elle." comme mon guide

Partielle Questions De Classe

Comme je l'ai mentionné dans les commentaires: il n'y a pas une telle chose comme une Classe Partielle. Le mot clé partial indique simplement qu'une catégorie peut être définie dans plus d'un fichier. Les règles de définition de la classe restent les mêmes, c'est juste que certains membres de la classe peuvent être définies dans un fichier, et d'autres parties dans d'autres fichiers.

Les problèmes que vous rencontrez ici ont rien à voir avec la partial mot-clé.

Vos Deux // Cela ne fonctionne pas les Notes

Le premier ressemble à ceci:

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

La première ligne déclare membre privé domaine de la ClassA nommé instanceOfDict et l'initialise. C'est pourquoi il compile.

La deuxième ligne tente de mettre de code exécutable (un appel de fonction) directement dans le top-niveau de la portée d'une classe. Vous ne pouvez pas le faire. Vous pouvez mettre un tas de choses au dessus du niveau de la portée d'une classe (par exemple, les champs, les propriétés, les méthodes, les délégués, les énumérations, les classes internes), mais vous ne pouvez pas mettre le code.

Votre deuxième question ressemble à ceci:

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              
    }          
}

FunctionA est un static la méthode. instanceOfDict est un champ privé de la classe, et non déclarée statique. Vous ne pouvez pas se référer à l'instance en instance au niveau des membres (méthodes, propriétés, domaines, ...) à partir d'une méthode statique. Lire sur le static mot-clé.

Création d'une Classe qui Expose de manière Sélective un Dictionnaire

Puisque vous voulez faire un peu de dictionnaire travail à l'intérieur d'une classe, mais de l'exposer à l'extérieur, je suis allé porc entier et fait de ma classe générique sur <TKey, TValue> pour qu'il fonctionne à l'aide de Dictionnaires de tout type.

J'ai aussi fait-il de mettre en œuvre la Collecte de l'Initialisation du Modèle , de sorte que vous pouvez initialiser les instances de votre classe comme il a été un dictionnaire.

L'utilisation de la Collection de l'Initialisation du Modèle, votre classe doit faire les choses:

  1. Mettre en œuvre IEnumerable ou IEnumerable<T> (T peut être de tout type, non seulement par le type, vous collectez - vous pouvez même simplement jeter un NotImplementedException si vous n'avez pas de soins)

  2. Inclure une méthode qui ressemble à public void Add (SomeType atLeastOneParameter). Vous pouvez avoir plus d'une surcharge de Add si vous le souhaitez.

Donc, je commence avec ceci (Notez qu'elle met en œuvre 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();
    }
}

C'est suffisant pour faire une classe principalement comme un dictionnaire (votre voulez probablement ajouter un peu de façon à obtenir les données, etc. Mais, c'est à vous (et vous voudrez probablement avoir un indexeur (sur TKey) et un TryGetValue.

Mais, nous allons ajouter un peu plus aléatoire de la fonctionnalité de la classe (mettre cela au plus haut niveau de la portée de la classe):

    public int Count => _theDictionary.Count;

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

Qui vous permettra de voir comment beaucoup de choses sont dans votre dictionnaire et vous permettent d'itérer sur les éléments (le KeyValuePairs) que le Dictionnaire des collections. N'hésitez pas à ajouter plus de fonctionnalités.

Enfin, pour tester cette...

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);
    }
}

Lorsque j'exécute ce code, j'obtiens:

TestDict Count: 6
one
five
eight
ten
hundredFive
threeHundred

La division de cette aide Partielle

Je ne sais pas pourquoi vous voulez utiliser partial class. Normalement c'est fait pour avoir deux morceaux de code qui sont édité et maintenu par des personnages différents (typique de la raison est pour Visual Studio templates/sorciers mécanisme pour maintenir un côté de la partial class et le programmeur de l'autre.

Les règles sont assez simples, il vous suffit de déclarer public partial class MyClass dans les deux fichiers. Les deux fichiers doivent être dans le même projet (par exemple, compilé dans le même Assemblée) et les classes doivent être dans le même espace de noms. Une fois que vous faire, il suffit de diviser le (haut-niveau) de pièces et de morceaux entre les deux partial class les déclarations.

Dans ce cas, je serais probablement le split de cette façon:

  • L'un d'un côté, je l'avais mis les deux fonctions nécessaires pour mettre en œuvre la déclaration de l' IEnumerator<TValue>:
    • public IEnumerator<TValue> GetEnumerator()
    • IEnumerator IEnumerable.GetEnumerator()
  • D'un autre côté, je l'avais mis tout le reste:
    • Le dictionnaire de déclaration et de intialization
    • L'autre agent recenseur: public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
    • public int Count => _theDictionary.Count;
    • public void Add(TKey key, TValue value)
2021-11-23 01:45:02

Je ne peux pas exprimer combien je suis reconnaissant pour cela. Cela m'a aussi aidé à briser quelques idées fausses que j'ai eu. Parfois apprendre la programmation devient un mais frustrant, mais heureusement il y a incroyable de personnes comme vous, qui consacrent une partie de sa journée à aider les autres. Merci encore!
roccaforte

Oui, je le fais. Heureusement, j'ai juste d'obtenir ce badge, qui me permet en tant que nouveau venu de commencer la négociation d'une telle monnaie. :-)
roccaforte

Dans d'autres langues

Cette page est dans d'autres langues

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