& # 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
如果是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);
}
}
无法测试,但我想应该可以解决问题。