Încă nu pot spune ceea ce vrei să faci. Dar voi face meu cel mai bun să-ți arăt niște lucruri.
Eu iau aceasta propozitie ai scris: "La sfârșitul scopul este de a expune acest dicționar și permite diferite metode pentru a citi/scrie din/în ea." ca ghidul meu
Parțială Clasa De Probleme
După cum am menționat în comentarii: nu există un astfel de lucru ca o Parțială Clasa. Cuvântul cheie parțială pur și simplu indică faptul că o clasă poate fi definită în mai mult de un fișier. Definirea normelor pentru clasa rămân aceleași, doar că unii dintre membrii clasei poate fi definit într-un fișier și alte părți, în alte fișiere.
Problemele pe care le au aici au nimic de-a face cu partial
cuvinte cheie.
Două // Acest lucru nu funcționează Note
Primul se pare ca acest lucru:
partial class ClassA
{
ExampleDictionary instanceOfDict = new ExampleDictionary();
instanceOfDict.Add(1, "Test1"); // This does not work
//other code
}
Prima linie declară membru privat domeniul ClassA
nume instanceOfDict
și se inițializează. De aceea se compilează.
Cea de-a doua linie încearcă să pună runnable cod (un apel de funcție) direct în partea de sus-domeniul de aplicare la nivel de clasă. Nu poți face asta. Poti pune o gramada de lucruri la nivel de top în domeniul de aplicare al unei clase (de exemplu, câmpuri, proprietăți, metode, delegați, enum, clase interioare), dar nu poti pune codul de acolo.
A doua problema se pare ca acest lucru:
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
}
}
Tulb este un static
metoda. instanceOfDict
este un teren privat de clasa, care nu sunt declarate static. Nu te poti referi la o instanta la nivel de membri (metode, proprietăți, domenii, ...) de la o metodă statică. Citiți pe static
cuvinte cheie.
Crearea unei Clase care în mod Selectiv Expune un Dicționar
Când vrei să faci un dicționar de muncă în interiorul unei clase, dar expune la exterior, m-am dus la capăt și mi-class generic pe <TKey, TValue>
astfel încât acesta funcționează cu Dicționare de orice tip.
Am făcut, de asemenea, pune în aplicare Colecție de Inițializare Model , astfel încât să puteți inițializa instanțe din clasa ta doar ca a fost un dicționar.
Pentru a utiliza Colecție de Inițializare Model, clasa trebuie să facă pentru lucruri:
Punerea în aplicare IEnumerable
sau IEnumerable<T>
(T
poate fi de orice tip, nu doar tipul de colectare - puteți chiar și doar arunca o NotImplementedException
dacă nu-ți pasă)
Include o metodă care se pare ca public void Add (SomeType atLeastOneParameter)
. Puteți avea mai mult de o suprasarcină de Add
dacă vrei.
Deci, am început cu acest lucru (Rețineți că acesta pune în aplicare 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();
}
}
Asta e suficient pentru a face o clasa cea mai mare parte arata ca un dicționar (ta, probabil, doriți să adăugați o modalitate de a obține date, etc. Dar, care este de până la tine (probabil că doriți să aveți un indexer (pe TKey
) și o TryGetValue
.
Dar, hai să adăugați ceva mai mult aleatoare functionalitate la clasa (pune asta la nivel de top în domeniul de aplicare al clasei):
public int Count => _theDictionary.Count;
public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
{
foreach (var kvp in _theDictionary)
{
yield return kvp;
}
}
Care vă va permite să vedeți cât de multe lucruri sunt în dicționar și permite să itera peste articole ( KeyValuePairs
) că Dicționarul colecții. Simțiți-vă liber pentru a adăuga mai multe caracteristici.
În cele din urmă, pentru a testa acest lucru...
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);
}
}
Atunci când am rula acest cod, am obține:
TestDict Count: 6
one
five
eight
ten
hundredFive
threeHundred
Divizarea acest lucru, folosind Parțială
Nu știu de ce doriți să o utilizați partial class
. În mod normal, acest lucru este făcut pentru a avea două bucăți de cod care sunt editate/întreținute de diferite personalități (tipic motiv este pentru Visual Studio templating/vrajitorilor mecanism pentru a menține o parte a partial class
și programator celelalte.
Regulile sunt destul de simple, pur și simplu să declare public partial class MyClass
în două fișiere. Cele două fișiere trebuie să fie în același proiect (de exemplu, compilate în același Asamblare) și clase trebuie să fie în același spațiu de nume. Odată ce ai făcut asta, doar split (partea de sus la nivel de aplicare) biți și piese de pe cele două partial class
declarații.
În aceste cazuri, probabil că aș împărți-o în acest fel:
- Unul de o parte, aș pune două funcții necesare pentru punerea în aplicare declarate
IEnumerator<TValue>
:
public IEnumerator<TValue> GetEnumerator()
IEnumerator IEnumerable.GetEnumerator()
- Pe de altă parte, aș pune totul altceva:
- Dicționar declarație și intialization
- Alte enumerator:
public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
public int Count => _theDictionary.Count;
public void Add(TKey key, TValue value)