& # 39; System.Boolean& # 39;不能转换为类型'System.Reflection.R

本文关键字:System Reflection 类型 不能 Boolean 转换 | 更新日期: 2023-09-27 18:07:50

我有一个动态创建的类。我有另一个现有的类有数据,所以我试图将现有的类数据映射到动态创建的类属性。

但是动态类中的所有字段都显示为System.Reflection.RuntimePropertyInfo.

有没有人可以帮助我理解为什么动态类属性显示为System.Reflection.RuntimePropertyInfo,即使我们在创建时添加了指定的类型。

     public object FillData<TresultType>(TresultType result)
    {
        PropertyInfo[] pi = result.GetType().GetProperties();
        foreach (var property in pi)
        {
            var TargetProperty = this.GetType().GetProperty(property.Name);
            if (TargetProperty!=null)
            {
                TargetProperty.SetValue( this, property.GetValue(result, null), null );
            }
        }
        return this;
    }
在上面的代码中,这个对象是一个新创建的动态对象。出现问题的行是
    TargetProperty.SetValue( this, property.GetValue(result, null), null );

我的问题是我不能将现有的类属性类型(这里是布尔)转换为目标属性类型,显示为System.Reflection.RuntimePropertyInfo

下面是创建动态对象

的函数
    public object GetViewModel<TresultType, TviewModelType>(TresultType result, TviewModelType ViewModel)
    {
        if (DynamicType.asmBuilder == null)
            DynamicType.GenerateAssemblyAndModule();
        var finalType = DynamicType.modBuilder.GetType("Beacon11");
        TypeBuilder tb = DynamicType.CreateType(DynamicType.modBuilder, ViewModel.GetType().ToString());
        tb.SetParent(typeof(ResultViewModelVersionable));
        var sourceType = result.GetType();
        var targetType = tb.GetType();
        foreach (var property in sourceType.GetProperties())
        {
            var targetProperty = targetType.GetProperty(property.Name);
            if (targetProperty == null)
            {  
                DynamicType.CreateProperty(tb, property.Name, property.GetType());
            }
        }
        finalType = tb.CreateType();
        var Methods = tb.GetMethods();
        Object obj = Activator.CreateInstance(finalType);
        return obj;
    }

此函数创建类型为"TviewModelType"的模型,并添加"TresultType"中的字段和其中的数据。

    ResultViewModelVersionable Versionable = new ResultViewModelVersionable();
        var objModel=obj.GetViewModel(vModel,Versionable);
     Type myType = vModel.GetType();
        MethodInfo magicMethod = typ.GetMethod("FillData");
        MethodInfo generic = magicMethod.MakeGenericMethod(myType);
        object magicValue = generic.Invoke(objModel,new object[]{vModel});

请让我知道我是否可以遵循任何不同的方法。问候,Mohan

& # 39; System.Boolean& # 39;不能转换为类型'System.Reflection.R

如果是PropertyInfo.PropertyType == typeof(System.Reflection.RuntimePropertyInfo),那么您的属性类型为System.Reflection.RuntimePropertyInfo

你说你已经动态地创建了这个类型(可能使用反射发射)。这段代码可能有bug

错误在这里:

    foreach (var property in sourceType.GetProperties())
    {
        var targetProperty = targetType.GetProperty(property.Name);
        if (targetProperty == null)
        {  
            DynamicType.CreateProperty(tb, property.Name, property.GetType());
        }
    }

CreateProperty方法传递给RuntimePropertyInfo类型。试试这个:

    foreach (var property in sourceType.GetProperties())
    {
        var targetProperty = targetType.GetProperty(property.Name);
        if (targetProperty == null)
        {  
            DynamicType.CreateProperty(tb, property.Name, property.PropertyType);
        }
    }

无法测试,但我想应该可以解决问题。