Estoy tratando de implementar la transformación de datos usando el ejemplo Reflection 1 en mi código.
La GetSourceValue
función tiene un interruptor que compara varios tipos, pero quiero eliminar estos tipos y propiedades y GetSourceValue
obtener el valor de la propiedad usando solo una sola cadena como parámetro. Quiero pasar una clase y propiedad en la cadena y resolver el valor de la propiedad.
es posible?
c#
reflection
properties
pedrofernandes
fuente
fuente
public static T GetPropertyValue<T>(object obj, string propName) { return (T)obj.GetType().GetProperty(propName).GetValue(obj, null); }
src.GetType().GetProperty(propName)?.GetValue(src, null);
";).GetProperty
y lanzarPropertyNotFoundException
o algo si es nulo.)Qué tal algo como esto:
Esto le permitirá descender a propiedades usando una sola cadena, como esta:
Puede usar estos métodos como métodos estáticos o extensiones.
fuente
PropertyInfo.PropertyType
lugar deobj.GetType()
propiedades anidadas, al igual que acceder a la propiedad en una propiedad anidada.nameof
expresión a partir de C # 6 de esta manera:nameof(TimeOfDay.Minutes)
en el parámetro de nombre al llamar a la función para eliminar cadenas mágicas y agregar seguridad de tiempo de compilación a estas llamadas.Añadir a cualquiera
Class
:Entonces, puedes usarlo como:
fuente
SetValue
yGetValue
funcionan conObject
. Si necesita trabajar con un tipo específico, debe emitir el resultadoGetValue
y emitir el valor para asignarloSetValue
¿Qué pasa con el uso
CallByName
delMicrosoft.VisualBasic
espacio de nombres (Microsoft.VisualBasic.dll
)? Utiliza la reflexión para obtener propiedades, campos y métodos de objetos normales, objetos COM e incluso objetos dinámicos.y entonces
fuente
Gran respuesta de jheddings. Me gustaría mejorarlo permitiendo la referencia de matrices agregadas o colecciones de objetos, para que propertyName pueda ser property1.property2 [X] .property3:
fuente
Si uso el código de Ed S. obtengo
Parece que
GetProperty()
no está disponible en Xamarin.Forms.TargetFrameworkProfile
esProfile7
en mi Biblioteca de clases portátil (.NET Framework 4.5, Windows 8, ASP.NET Core 1.0, Xamarin.Android, Xamarin.iOS, Xamarin.iOS Classic).Ahora encontré una solución de trabajo:
Fuente
fuente
Sobre la discusión de las propiedades anidadas, puede evitar todo el material de reflexión si usa lo
DataBinder.Eval Method (Object, String)
siguiente:Por supuesto, necesitará agregar una referencia al
System.Web
ensamblaje, pero esto probablemente no sea gran cosa.fuente
El método para llamar ha cambiado en .NET Standard (a partir de 1.6). También podemos usar el operador condicional nulo de C # 6.
fuente
? operator
Usando PropertyInfo del espacio de nombres System.Reflection . Reflection compila perfectamente sin importar a qué propiedad intentemos acceder. El error aparecerá durante el tiempo de ejecución.
Funciona bien para obtener la propiedad Ubicación de un objeto
Obtendremos la ubicación: {X = 71, Y = 27} También podemos devolver location.X o location.Y de la misma manera.
fuente
Esta es una forma de obtener todas las propiedades con sus valores en una Lista.
fuente
type.GetProperty(pi.Name)
cuando eso es == para la variablepi
?if
y hágaloselfValue?.ToString()
De lo contrario, deshágaseif
y useselfValue==null?null:selfValue.ToString()
List<KeyValuePair<
es extraño, use un diccionarioDictionary<string, string>
El siguiente código es un método recursivo para mostrar la jerarquía completa de todos los nombres y valores de propiedades contenidos en la instancia de un objeto. Este método utiliza una versión simplificada de la
GetPropertyValue()
respuesta de AlexD anterior en este hilo. Gracias a este hilo de discusión, ¡pude descubrir cómo hacer esto!Por ejemplo, uso este método para mostrar una explosión o volcado de todas las propiedades en una
WebService
respuesta llamando al método de la siguiente manera:fuente
fuente
fuente
El siguiente método funciona perfecto para mí:
Para obtener el valor de la propiedad:
Para establecer el valor de la propiedad:
fuente
fuente
Aquí hay otra forma de encontrar una propiedad anidada que no requiera que la cadena le indique la ruta de anidación. Crédito a Ed S. por el método de propiedad única.
fuente
Type.GetProperty
regresa ennull
lugar de llamarGetValue
y haber sidoNullReferenceException
lanzado en un bucle.Nunca mencionas qué objeto estás inspeccionando, y dado que estás rechazando los que hacen referencia a un objeto dado, supondré que te refieres a uno estático.
Tenga en cuenta que marqué el objeto que se está inspeccionando con la variable local
obj
.null
significa estático; de lo contrario, configúrelo como desee. También tenga en cuenta que esteGetEntryAssembly()
es uno de los pocos métodos disponibles para obtener el ensamblaje "en ejecución", es posible que desee jugar con él si tiene dificultades para cargar el tipo.fuente
Echa un vistazo a la biblioteca Heleonix.Reflection . Puede obtener / establecer / invocar miembros por rutas, o crear un captador / definidor (lambda compilado en un delegado) que es más rápido que la reflexión. Por ejemplo:
O cree un captador una vez y guarde en caché para su reutilización (esto es más eficiente pero podría arrojar NullReferenceException si un miembro intermedio es nulo):
O si desea crear uno
List<Action<object, object>>
de los diferentes captadores, simplemente especifique los tipos base para los delegados compilados (las conversiones de tipos se agregarán a las lambdas compiladas):fuente
camino más corto ...
fuente
jheddings y AlexD escribieron excelentes respuestas sobre cómo resolver cadenas de propiedades. Me gustaría echar el mío en la mezcla, ya que escribí una biblioteca dedicada exactamente para ese propósito.
La clase principal de Pather.CSharp es
Resolver
. Por defecto, puede resolver propiedades, matrices y entradas de diccionario.Entonces, por ejemplo, si tienes un objeto como este
y quieres conseguirlo
Property2
, puedes hacerlo así:Este es el ejemplo más básico de los caminos que puede resolver. Si desea ver qué más puede hacer, o cómo puede extenderlo, simplemente diríjase a su página de Github .
fuente
Aquí está mi solución. Funciona también con objetos COM y permite acceder a elementos de colección / matriz desde objetos COM.
fuente
Esto es lo que obtuve en base a otras respuestas. Un poco exagerado en ser tan específico con el manejo de errores.
fuente