2012-01-05 11 views
10

Sono abbastanza sicuro che questa è una domanda duplicata, ma non riesco a trovare l'originale (s).Collegamento di meta-informazioni a un oggetto in .NET

Ricevo alcuni oggetti a cui devo "allegare" alcune informazioni. Fondamentalmente, se quell'oggetto ritorna sempre allo stesso pezzo di codice, ho bisogno di vedere che l'ho visto prima.

ie. qualcosa di simile:

Dictionary<WeakReference<ObjectType>, string> _Cache; 

Annotare il riferimento debole in là (lo so WeakReference non è generica btw), ho bisogno di fare la chiave della cache un riferimento debole, per gestire il fatto che gli oggetti sono GC' fuori dal mio controllo

Ora, posso rendere quella cache piena di riferimenti deboli, ma mi sembra di ricordare un tipo simile di sistema già esistente in .NET, che è stato GC automaticamente accanto all'oggetto.

Nota che non ricordo il sovraccarico di questo, quindi mi assicurerò di leggere sull'argomento prima di decidere se questa è una soluzione buona/migliore della mia cache. Sfortunatamente non posso cambiare l'oggetto in questione, quindi ho bisogno di tenere traccia di questa meta-informazione da qualche altra parte.

miei limiti:

  • L'oggetto non è mio, quindi non può cambiare in ogni modo possibile
  • non posso ereditare dalla oggetto, in quanto è sigillato, inoltre, sono data gli oggetti, io non li costruisco, quindi dovrei essere in grado di sostituire un'istanza con un nuovo oggetto di tipo discendente perché sia ​​utile
  • Gli oggetti sono fuori controllo dal mio controllo, quindi io non si può semplicemente usare un dizionario, che si riempirà lentamente, sia con "riferimenti" a oggetti inesistenti, sia con hol d sugli oggetti, avrei bisogno di un dizionario con una chiave di riferimento debole (quindi: dizionario personalizzato)
  • Gli oggetti, anche se potrei incapsularli nel mio codice personale e quindi portare con sé le informazioni richieste, sono passati a un quadro fuori dal mio controllo, e restituito a me dalla stessa, e quindi ho bisogno di essere in grado di recuperare/cercare il vecchio informazioni con appena l'oggetto in questione

in sostanza, qualcosa di simile:

PropertyAttacher.Attach(instance, "Name", name); 

Mi ricordo correttamente? Quali sono le classi coinvolte?

+0

Tale questione non è rilevante qui, anche se il problema sembra simile, la risposta accettata qui cita utilizzando un attributo, o alterare il tipo (o discendente da esso), né di cui posso fare –

+4

Informazioni su ConditionalWeakTable (http://msdn.microsoft.com/en-us/library/dd287757.aspx)? –

+0

@Simon Grazie, era esattamente quello che stavo cercando. Se lo lasci come risposta, lo accetterò. –

risposta

6

potrebbe essere alla ricerca for .NET 4 di ConditionalWeakTable<TKey, TValue>

+0

Sì, era tutto, anche se è per .NET 4.0, e ho bisogno di qualcosa per 3.5, questo era quello che stavo ricordando. –

3

Forse è possibile creare una dizione indicizzata da RuntimeHelpers.GetHashCode.

Da MSDN:

RuntimeHelpers.GetHashCode è utile in scenari in cui ti stanno a cuore identità di un oggetto. Due stringhe con contenuti identici restituiscono valori diversi per RuntimeHelpers.GetHashCode, , perché sono oggetti stringa diversi, sebbene il loro contenuto sia lo stesso.

MODIFICA: @Simon La soluzione di Mourier sembra essere molto migliore.

+0

Ho pensato a questo, ma questo significherebbe che memorizzo deboli riferimenti agli oggetti, insieme agli hashcode, al fine di rilevare che gli oggetti sono stati raccolti, o rischio che il dizionario cresca senza limiti. Per il momento lascerò aspettare questa parte del problema, visto che ci proponiamo di aggiornare il nostro progetto a .NET 4.0 nel prossimo futuro. –

Problemi correlati