¿Hay alguna manera en C # donde pueda usar la reflexión para establecer una propiedad de objeto?
Ex:
MyObject obj = new MyObject();
obj.Name = "Value";
Quiero establecer obj.Name
con reflexión. Algo como:
Reflection.SetProperty(obj, "Name") = "Value";
¿Hay alguna forma de hacer esto?
c#
.net
reflection
properties
Melursus
fuente
fuente
var val = Convert.ChangeType(propValue, propInfo.PropertyType);
fuente: devx.com/vb2themax/Tip/19599obj.GetType().GetProperty("Name")?.GetSetMethod()?.Invoke(...)
CanWrite=False
tipos, ¿verdad?También puedes hacer:
donde target es el objeto que tendrá su propiedad establecida.
fuente
Reflexión, básicamente, es decir
o hay bibliotecas para ayudar tanto en términos de conveniencia como de rendimiento; por ejemplo con FastMember :
(que también tiene la ventaja de no necesitar saber de antemano si es un campo o una propiedad)
fuente
O podría envolver el único revestimiento de Marc dentro de su propia clase de extensión:
y llámalo así:
Como buena medida, agreguemos un método para obtener un valor de propiedad:
fuente
Sí, usando
System.Reflection
:fuente
Use algo como esto:
o
fuente
También puede acceder a los campos de manera similar:
Con la reflexión, todo puede ser un libro abierto :) En mi ejemplo, estamos vinculados a un campo de nivel de instancia privada.
fuente
Puede probar esto cuando desee asignar en masa propiedades de un Objeto desde otro Objeto usando los nombres de Propiedades:
fuente
Acabo de publicar un paquete Nuget que permite configurar no solo las propiedades de primer nivel, sino también las propiedades anidadas en el objeto dado en cualquier profundidad.
Aquí esta el paquete
Establece el valor de una propiedad de un objeto por su ruta desde la raíz.
El objeto puede ser un objeto complejo y la propiedad puede ser una propiedad anidada profunda de varios niveles o puede ser una propiedad directamente debajo de la raíz.
ObjectWriter
encontrará la propiedad utilizando el parámetro de ruta de propiedad y actualizará su valor. La ruta de propiedad son los nombres adjuntos de las propiedades visitadas desde la raíz hasta la propiedad del nodo final que queremos establecer, delimitadas por el parámetro de cadena delimitador.Uso:
Para configurar las propiedades directamente debajo de la raíz del objeto:
Es decir.
LineItem
la clase tiene una propiedad int llamadaItemId
Para configurar la propiedad anidada en varios niveles debajo de la raíz del objeto:
Es decir.
Invite
La clase tiene una propiedad llamadaState
, que tiene una propiedad llamadaInvite
(de tipo Invitar), que tiene una propiedad llamadaRecipient
, que tiene una propiedad llamadaId
.Para hacer las cosas aún más complejas, la
State
propiedad no es un tipo de referencia, es unstruct
.Aquí es cómo puede establecer la propiedad Id (al valor de cadena de "perspectiva") en la parte inferior del árbol de objetos en una sola línea.
fuente
Basado en la sugerencia de MarcGravell, he construido el siguiente método estático: el método asigna genéricamente todas las propiedades coincidentes del objeto fuente al destino usando FastMember
fuente