' System.Boolean'无法转换为类型' System.Reflection.RuntimePropertyInfo'

时间:2014-06-08 11:56:40

标签: c# reflection.emit system.reflection

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

但动态类中的所有文件都将其类型显示为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 );

我的问题是我无法将现有的类属性类型(此处为Boolean)转换为显示为System.Reflection.RuntimePropertyInfo的Target属性类型

这是我创建动态对象的函数

    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});

如果我可以关注任何不同的approch,请告诉我。 问候, 莫汉

2 个答案:

答案 0 :(得分:1)

如果PropertyInfo.PropertyType == typeof(System.Reflection.RuntimePropertyInfo),则您的媒体资源属于System.Reflection.RuntimePropertyInfo

您说您已动态创建此类型(可能使用反射发射)。该代码可能存在错误。

答案 1 :(得分:0)

错误在于:

    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);
        }
    }

无法测试这一点,但我怀疑应该解决问题。