Impostare le proprietà dell’oggetto utilizzando la reflection
C’è un modo in C# in cui posso utilizzare la reflection per impostare una proprietà di un oggetto?
Ex:
MyObject obj = new MyObject();
obj.Name = "Value";
Voglio impostare obj.Name
con la riflessione. Qualcosa come:
Reflection.SetProperty(obj, "Name") = "Value";
C’è un modo di fare questo?
Sì, è possibile utilizzare
Type.InvokeMember()
:Questo genererà un’eccezione se
obj
non hanno una proprietà chiamataName
, o non può essere impostato.Un altro approccio è quello di ottenere i metadati della proprietà, e quindi impostare. Questo vi permetterà di verificare l’esistenza della proprietà e verificare che è possibile impostare:
var val = Convert.ChangeType(propValue, propInfo.PropertyType);
fonte: devx.com/vb2themax/Tip/19599obj.GetType().GetProperty("Name")?.GetSetMethod()?.Invoke(...)
CanWrite=False
tipi, giusto?Si può anche fare:
cui obiettivo è l’oggetto che avrà il suo set di proprietà.
Riflessione, in fondo, cioè
o ci sono librerie per aiutare sia in termini di comodità e prestazioni; per esempio con FastMember:
(che ha anche il vantaggio di non aver bisogno di sapere in anticipo se si tratta di un campo di vs proprietà)
O si può avvolgere Marc one liner all’interno della vostra estensione di classe:
e di chiamare le cose come questo:
Per buona misura, aggiungiamo un metodo per ottenere un valore di proprietà:
Sì, utilizzando
System.Reflection
:È anche possibile accedere ai campi utilizzando un simillar modo:
Con la riflessione, tutto può essere un libro aperto:) Nel mio esempio ci sono vincolanti per un’istanza privata a livello di campo.
Utilizzare qualcosa di simile a questo :
o
Si può provare questo fuori quando si desidera di massa-assegnare le proprietà di un Oggetto da un altro Oggetto, utilizzando nomi di Proprietà:
Ho appena pubblicato un pacchetto Nuget che consente di impostare non solo il primo livello di Proprietà, ma anche nidificate proprietà in oggetto dato in qualsiasi profondità.
Qui è il pacchetto
Imposta il valore di una proprietà di un oggetto dal suo percorso dalla radice.
L’oggetto può essere un oggetto complesso e la struttura può essere a più livelli di profondità proprietà nidificate o può essere una proprietà direttamente sotto la root.
ObjectWriter
trovare la struttura, utilizzando le proprietà parametro percorso e aggiornare il suo valore. La struttura del percorso è aggiunto, i nomi delle proprietà visitato dalla radice alla fine il nodo della proprietà che si desidera impostare, delimitato dal delimitatore di stringa parametro.Uso:
Per l’impostazione delle proprietà direttamente al di sotto dell’oggetto principale:
Ie.
LineItem
classe ha un int proprietà denominataItemId
Per l’impostazione di proprietà nidificate più livelli al di sotto dell’oggetto principale:
Ie.
Invite
classe ha una proprietà chiamataState
, che ha una proprietà chiamataInvite
(di Invitare tipo), che ha una proprietà chiamataRecipient
, che ha una proprietà chiamataId
.Per rendere le cose ancora più complesse, il
State
proprietà non è un tipo di riferimento, è unstruct
.Qui è come si può impostare l’Id di proprietà (valore stringa di “outlook”) in fondo l’albero di oggetti in una singola riga.
Base MarcGravell suggerimento, ho costruito il seguente metodo statico.Il metodo genericamente assegna a tutti gli immobili da fonte oggetto di destinazione utilizzando FastMember