在动态构造对象时,对象与目标类型不匹配

时间:2016-12-29 20:15:47

标签: c# asp.net .net reflection

我有一些反射代码,它采用一种对象类型,然后动态创建另一个具有相同属性(不同类型)的对象,然后在新对象上设置属性。

如屏幕截图所示,属性是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;
} 

截图

enter image description here

0 个答案:

没有答案