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:
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)
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)