with what type property method done create c# reflection

what - type.gettype c#



Reflexión de C#: el objeto no coincide con el tipo de destino (3)

Estoy intentando usar el método propertyInfo.SetValue () para establecer un valor de propiedad del objeto con una reflexión, y obtengo la excepción "El objeto no coincide con el tipo de destino". Realmente no tiene sentido (¡al menos para mí!), Ya que estoy tratando de establecer una propiedad de cadena simple en un objeto con un valor de reemplazo de cadena. Aquí hay un fragmento de código: está contenido dentro de una función recursiva, por lo que hay un montón de código más, pero esto es lo más importante:

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties().FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); businessObject = fieldPropertyInfo.GetValue(businessObject, null); fieldPropertyInfo.SetValue(businessObject, replacementValue, null);

He verificado que "businessObject" y "replacementValue" son del mismo tipo al hacer esta comparación, que devolvió verdadero:

businessObject.GetType() == replacementValue.GetType()


Está intentando establecer el valor de la propiedad en businessObject en otro valor del tipo de businessObject , no el tipo de esa propiedad.

Para que este código funcione, replacementValue debe ser del mismo tipo que el campo definido por piecesLeft[0] , y obviamente no es ese tipo.


Estás intentando establecer el valor del valor de propertyinfo. Porque estás sobrescribiendo el businessObject

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); // The result should be stored into another variable here: businessObject = fieldPropertyInfo.GetValue(businessObject, null); fieldPropertyInfo.SetValue(businessObject, replacementValue, null);

Debería ser algo como:

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); // also you should check if the propertyInfo is assigned, because the // given property looks like a variable. if(fieldPropertyInfo == null) throw new Exception(string.Format("Property {0} not found", f.Name.ToLower())); // you are overwriting the original businessObject var businessObjectPropValue = fieldPropertyInfo.GetValue(businessObject, null); fieldPropertyInfo.SetValue(businessObject, replacementValue, null);


Sospecho que solo quieres eliminar la segunda línea. ¿Qué está haciendo allí de todos modos? Está obteniendo el valor de la propiedad del objeto al que hace referencia businessObject , y lo establece al nuevo valor de businessObject . Entonces, si esto realmente es una propiedad de cadena, el valor de businessObject será una referencia de cadena más adelante, ¡y luego está tratando de usar eso como el objetivo para establecer la propiedad! Es un poco como hacer esto:

dynamic businessObject = ...; businessObject = businessObject.SomeProperty; // This returns a string, remember! businessObject.SomeProperty = replacementValue;

Eso no va a funcionar.

No está claro cuál es el valor de replacementValue , ya sea si se trata de la cadena de reemplazo o de un objeto de negocio para obtener el valor de reemplazo real, pero sospecho que usted también desea:

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); fieldPropertyInfo.SetValue(businessObject, replacementValue, null);

O:

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties() .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower()); object newValue = fieldPropertyInfo.GetValue(replacementValue, null); fieldPropertyInfo.SetValue(businessObject, newValue, null);