Ho un dizionario generico di oggetti in cui la chiave è di tipo Type
:impostazione del tipo di sicurezza di oggetti con un dizionario che ha un `type` chiave
public class DynamicObject : IDictionary<Type, object>
L'idea è che questo oggetto è condiviso in un'architettura basata su plugin e quindi un tipo (che potrebbe risiedere in un plugin .dll) viene utilizzato come chiave per evitare conflitti tra i plugin. Questo tipo viene anche utilizzato per memorizzare i metadati relativi al campo (ad esempio una descrizione di quel campo o il tipo effettivo di quel campo).
Attualmente i plugin necessario per impostare il valore di campi su questo oggetto utilizzando il codice simile al seguente:
DynamicObject someObject;
string someValue;
someObject[typeof(UsernameField)] = someValue;
L'unico problema è che questo non è di tipo sicuro - anche se il tipo UsernameField
è consapevole del tipo esatto del valore che si aspetta (ad esempio int
o in questo caso string
), il valore fornito qui viene semplicemente digitato come oggetto. Mi piacerebbe usare i generici per rendere sicura l'impostazione/acquisizione del tipo di proprietà, ma non sono sicuro di come. Finora il migliore che è venuta in mente è questa:
// 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);
Questo è sicuro tipo, tuttavia significa che ciascuno dei miei tipi di campo (ad esempio UsernameField
) ha un metodo statico quasi identico Set
.
Come posso accedere in modo sicuro ai valori in questo modo senza avere molti metodi quasi identici su ciascuno dei miei tipi di campo?
Per inciso, sta usando Type
come una chiave come questa una buona idea o ci sono insidie nascoste di cui non sono ancora a conoscenza?
qual è la relazione tra il 'type' e il' object' qui? l'oggetto 'è sempre di tipo' Type'? –
Puoi dare nomi più significativi a MyObject e MyField in modo che possiamo capire il loro significato? –
@MarcGravell Al momento i valori non sono effettivamente dello stesso tipo della chiave, quindi in 'someValue' è in realtà una' stringa' non un 'MyField'. Detto questo, potrei cambiarlo in modo che questo sia il caso (avendo visto la tua risposta ora cancellata) – Justin