我有一个动态创建的类。我有另一个现有的类,它有数据,所以我试图将现有的类数据映射到动态创建的类属性。
但动态类中的所有文件都将其类型显示为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,请告诉我。 问候, 莫汉
答案 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);
}
}
无法测试这一点,但我怀疑应该解决问题。