我有一些反射代码,它采用一种对象类型,然后动态创建另一个具有相同属性(不同类型)的对象,然后在新对象上设置属性。
如屏幕截图所示,属性是Int32,所以我不知道为什么我在Setvalue方法上获得此异常。
异常消息是“动态构造对象时对象与目标类型不匹配”。
代码:
private static T AssembleObject(K sourceObject, T editObject, bool enableAssembleChildObjects, int? level, int? currentLevel)
{
if (sourceObject == null)
return default(T);
T resultObject = (editObject != null) ? editObject : default(T);
//Se incrementa el nivel de profundidad
if (currentLevel.HasValue)
++currentLevel;
PropertyInfo[] sourceObjectProperties = typeof(K).GetProperties();
PropertyInfo[] resultObjectProperties = typeof(T).GetProperties();
if (sourceObjectProperties != null && resultObjectProperties != null)
{
if (editObject == null)
{
resultObject = new T();
}
for (int i = 0; i < sourceObjectProperties.Length; i++)
{
PropertyInfo fromProperty = (PropertyInfo)sourceObjectProperties[i];
for (int j = 0; j < resultObjectProperties.Length; j++)
{
PropertyInfo toProperty = (PropertyInfo)resultObjectProperties[j];
if (fromProperty.Name == toProperty.Name)
{
//Se obtienen los tipos básicos del objeto
if (fromProperty.PropertyType.IsValueType ||
(fromProperty.PropertyType.IsArray && fromProperty.PropertyType.GetElementType().IsValueType) ||
fromProperty.PropertyType == typeof(System.String))
{
//Se establece el valor de la propiedad
if (toProperty.CanWrite)
{
toProperty.SetValue(resultObject, fromProperty.GetValue(sourceObject, null), null);
}
}
else
{
if (enableAssembleChildObjects)
{
//Validación del nivel de profundidad
if (level.HasValue && currentLevel.HasValue && (currentLevel > level))
continue;
//Se obtiene el tipo del ensamblador
Type hermesAssemblerType = typeof(HermesAssembler<,>);
//Se definen los argumentos y se crea el tipo genérico dinamicamente
Type[] typeArgs = { fromProperty.PropertyType, toProperty.PropertyType };
Type resultType = hermesAssemblerType.MakeGenericType(typeArgs);
//Se obtiene la lista de métodos del tipo
MethodInfo[] methods = resultType.GetMethods(BindingFlags.NonPublic | BindingFlags.Static);
string methodName = (fromProperty.PropertyType.IsArray) ? "AssembleObjects" : "AssembleObject";
//Se obtiene el método estático específico a ejecutar
MethodInfo method = (from m in methods
where m.Name == methodName && m.GetParameters().Length == 3
select m).First();
//Se obtiene el valor desde la propiedad fuente
object sourceValue = fromProperty.GetValue(sourceObject, null);
//Se ejecuta el método
object resultValue = (sourceValue != null) ? method.Invoke(null, new object[] { sourceValue, level, currentLevel }) : null;
if (toProperty.CanWrite)
{
//Se establece el valor de la propiedad
toProperty.SetValue(resultObject, resultValue, null);
}
}
}
break;
}
}
}
}
return resultObject;
}
截图