2012-01-05 18 views
10

Estoy bastante seguro de que esta es una pregunta duplicada, pero no puedo encontrar la (s) original (es).Adjuntar metainformación a un objeto en .NET

Obtengo algunos objetos que necesito para "adjuntar" algo de información. Básicamente, si ese objeto alguna vez vuelve a la misma pieza de código, necesito ver que lo he visto antes.

es decir. algo como esto:

Dictionary<WeakReference<ObjectType>, string> _Cache; 

Nota a los débiles referencia allí (sé WeakReference no es genérica por cierto), que necesito para hacer la clave de la memoria caché una referencia débil, para manejar el hecho de que los objetos son GC' ed fuera de mi control.

Ahora, puedo hacer que la memoria caché esté llena de referencias débiles, pero parece recordar un tipo similar de sistema que ya existe en .NET, que fue sometido a GC automáticamente junto con el objeto.

Tenga en cuenta que no recuerdo los gastos generales de esto, así que me aseguraré de leer sobre el tema antes de decidir si esta es una buena/mejor solución que mi propio caché. Lamentablemente, no puedo cambiar el objeto en cuestión, así que debo hacer un seguimiento de esta metainformación en otro lugar.

Mis limitaciones:

  • el objeto no es la mía, así que no se puede cambiar en cualquier forma posible
  • no puedo heredar del objeto, ya que está sellado, además, estoy dada los objetos, no los construyo, entonces tendría que ser capaz de reemplazar una instancia con un nuevo objeto de un tipo descendiente para que esto sea útil
  • Los objetos están fuera de mi control, así que no puede simplemente usar un diccionario, que se llenará lentamente, ya sea con "referencias" a objetos inexistentes, o lo hará d en los objetos, necesitaría un diccionario con una tecla de referencia débil (por lo tanto: diccionario personalizado)
  • Los objetos, aunque podría encapsularlos dentro de mi propio código y llevar así la información requerida, pasan a un marco fuera de mi control, y se le dio de nuevo a mí de la misma, y ​​por lo tanto tengo que ser capaz de recuperar/buscar la información de edad con sólo el objeto en cuestión

Básicamente, algo así como:

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

¿Lo recuerdo correctamente? ¿Cuáles son las clases involucradas?

+0

Esa pregunta no es pertinente en este caso, aunque el problema parece similar, la respuesta aceptada aquí menciona el uso de un atributo, o alterar el tipo (o descender de él), ni de lo que puedo hacer –

+4

¿Qué pasa con ConditionalWeakTable (http://msdn.microsoft.com/en-us/library/dd287757.aspx)? –

+0

@Simon Gracias, eso era exactamente lo que estaba buscando. Si lo dejas como respuesta, lo aceptaré. –

Respuesta

6

Tal vez está buscando para .NET de 4 ConditionalWeakTable<TKey, TValue>

+0

Sí, eso fue, aunque es para .NET 4.0, y necesito algo para 3.5, esto era lo que estaba recordando. –

3

Tal vez puedas construir un dictionnary indexado por RuntimeHelpers.GetHashCode.

De MSDN:

RuntimeHelpers.GetHashCode es útil en escenarios en los que se preocupan por la identidad del objeto. Dos cadenas con contenido idéntico devolverán valores diferentes para RuntimeHelpers.GetHashCode, porque son diferentes objetos de cadena, aunque sus contenidos son los mismos.

EDIT: @Simon La solución de Mourier parece ser mucho mejor.

+0

He pensado sobre esto, pero esto significaría que almaceno referencias débiles a los objetos, junto con los códigos hash, para detectar que los objetos han sido recolectados, o arriesgo que el diccionario simplemente crezca sin límites. Por el momento voy a dejar que esta parte del problema espere, ya que estamos programados para actualizar nuestro proyecto a .NET 4.0 en el futuro cercano. –

Cuestiones relacionadas