tengo un diccionario genérico de objetos, donde la clave es de tipo Type
:configuración de seguridad de tipos de objetos con un diccionario que tiene un `type` clave
public class DynamicObject : IDictionary<Type, object>
La idea es que este objeto está compartida en una arquitectura basada en complementos y, por lo tanto, un tipo (que podría residir en un plugin .dll) se utiliza como clave para evitar conflictos entre complementos. Este tipo también se usa para almacenar metadatos sobre el campo (como una descripción de ese campo o el tipo real de ese campo).
pluginsActualmente necesitan para establecer el valor de los campos en este objeto mediante código similar al siguiente:
DynamicObject someObject;
string someValue;
someObject[typeof(UsernameField)] = someValue;
El único problema con esto es que esto no es de tipo seguro - a pesar de que el tipo UsernameField
es consciente del tipo exacto del valor que está esperando (p. ej., int
o en este caso string
), el valor proporcionado aquí solo se escribe como un objeto. Me gustaría utilizar genéricos para hacer que la configuración/obtención de propiedades sea segura, pero no estoy seguro de cómo. Hasta el momento los mejores que he llegado con esto es:
// Field is a base class for all types used as keys on DynamicObject
[Description("Username of the user")]
public class UsernameField : Field
{
public static void Set(DynamicObject obj, string value)
{
obj[typeof(UsernameField)] = someValue;
}
}
// To set fields
UsernameField.Set(obj, someValue);
Esto es seguro tipo, sin embargo, significa que cada uno de mis tipos de campo (por ejemplo UsernameField
) tiene un casi idéntico método estático Set
.
¿Cómo puedo tener acceso de tipo seguro a los valores de esta manera sin tener muchos métodos casi idénticos en cada uno de mis tipos de campo?
Como un lado, está utilizando Type
como una buena idea como esta clave o hay trampas ocultas que aún no conozco?
cuál es la relación entre el '' type' y la object' aquí? ¿El 'object' siempre es de tipo' Type'? –
¿Puedes dar nombres más significativos a MyObject y MyField para que podamos entender su significado? –
@MarcGravell Por el momento, los valores no son en realidad del mismo tipo que la clave, por lo que en el anterior 'someValue' es en realidad una 'cadena' no un 'MyField'. Habiendo dicho eso, podría cambiarlo para que este sea el caso (habiendo visto tu respuesta ahora eliminada) – Justin