Jeżeli bazowy typ IDictionary
nie implementuje IDictionary<string, dynamic>
, nie można rzutować obiektu, kropka. Jeśli tak, wystarczy zwykła obsada przez (IDictionary<string, dynamic>)localVar
.
Jeśli tak nie jest, są dwie rzeczy, które możesz zrobić:
- Kopiuje
IDictionary
do typu rodzajowego.
- Zbuduj klasę Adapter, która akceptuje
IDictionary
jako zależność i implementuje typowe IDictionary
, które chcesz, mapując połączenia z jednego do drugiego.
Edit: Przykładowy kod, który właśnie pisał skopiuje słownika za każdym razem robi się nazywa! Będę edytować ponownie za chwilę z sugerowanym kodem.
Wariant 1
Twoje podejście przykładowy kod jest stałe jako sposób kopiowania danych, ale kopia powinna być buforowane lub masz zamiar skopiować wiele razy. Sugeruję, abyś wstawił rzeczywisty kod tłumaczenia do osobnej metody i zadzwonił do niego z twojej nieruchomości przy pierwszym użyciu. Na przykład:
private IDictionary dataLayerProperties;
private IDictionary<string, dynamic> translatedProperties = null;
protected virtual IDictionary<string, dynamic> Properties
{
if(translatedProperties == null)
{
translatedProperties = TranslateDictionary(dataLayerProperties);
}
return translatedProperties;
}
public IDictionary<string, dynamic> TranslateDictionary(IDictionary values)
{
return values.Keys.Cast<string>().ToDictionary(key=>key, key => values[key] as dynamic);
}
Istnieje oczywiste przeciwwskazanie do tego podejścia ... co zrobić, jeśli dataLayerProperties wymaga odświeżenia? Musisz iść do ustawiania translatedProperties ponownie wartość null itp
Opcja 2
To jest mój preferowany podejście.
public class TranslatedDictionary : IDictionary<string, dynamic>
{
private IDictionary Original = null;
public TranslatedDictionary(IDictionary original)
{
Original = original;
}
public ICollection<string> Keys
{
get
{
return Original.Keys.Cast<string>().ToList();
}
}
public dynamic this[string key]
{
get
{
return Original[key] as dynamic;
}
set
{
Original[key] = value;
}
}
// and so forth, for each method of IDictionary<string, dynamic>
}
//elsewhere, using your original property and field names:
Properties = new TranslatedDictionary(properties);
Teraz istnieją oczywiste zalety tego podejścia, jak również, najbardziej rażące jest fakt, że Keys
(i wartość, a wszystko, co zwraca ICollection
na IDictionary
musi powrócić nową tablicę na każde wezwanie. Ale pozwala to nadal najbardziej elastycznego podejścia, ponieważ zapewnia, że dane są zawsze aktualne.
Twój nowy kod przykładowy skopiuje dane z IDictionary * za każdym razem, gdy zostanie wywołany *. – Randolpho
Jedyny sposób, aby być na bieżąco. –
To prawda. Mimo to możesz wypróbować moją nowo sugerowaną opcję 2. Chociaż będzie kopiowanie, jeśli zostanie wywołane 'Keys' lub' Values', zawsze będzie ono aktualne, podczas tłumaczenia z jednego typu na inny. – Randolpho