我使用.NET实体框架。我想将属性从一个EntityObject复制到另一个EntityObject。但是System.Type.GetProperties()似乎没有返回在分部类上定义的属性。
代码:
在Visual Studio生成的XXX.edmx/XXX.Designer.cs中,我有一个类MyTable:
public partial class MyTable: EntityObject{..}
我想给MyTable类添加一些属性,所以我添加了文件XXX.Manual.cs:
public partial class MyTable: EntityObject{
public string myProp{get;set;}
}
但是myTableObj.GetType().GetProperties()
不包含myProp!!!
如何使用反射获取myProp?
[EDIT]我想对Alex的回答发表评论,但不知道为什么代码部分没有格式化。
是的,这很奇怪。我使用此代码将属性从实体复制到另一个对象:
public static void CopyTo(this EntityObject Entity, EntityObject another){
var Type = Entity.GetType();
foreach (var Property in Type.GetProperties()){
...
Property.SetValue(another, Property.GetValue(Entity, null), null);
}
}
//in some other place:
myTableObj.CopyTo(anotherTableObj);
属于couse myTableObj&另一个TableObj的类型为MyTable。
当调试到CopyTo方法时,VS显示Entity&另一种是MyTable&我可以看到实体.myProp,另一个.myProp
但是foreach语句中的Property var根本不会循环到myProp属性!
[EDIT]对不起。上面的代码(CopyTo方法)是从迪亚曼迪耶夫对另一个问题的回答中复制的
但他的代码是错误的:"break"语句必须替换为"continue":D
首先,分部类只是源代码的拆分方式。它不会影响已编译的程序集。
您可能看不到myProp
属性,因为myTableObj
的类型不是MyTable
。
试试这个:
var property = typeof(MyTable).GetProperty("myProp");
[EDIT]
刚刚检查:
EntityObject x = new MyTable();
var property1 = typeof(MyTable).GetProperty("myProp");
var property2 = x.GetType().GetProperty("myProp");
property1
和property2
都返回了该属性。
[EDIT]
试过你的代码,经过小修改后就可以了:
public static void CopyTo(EntityObject fromEntity, EntityObject toEntity)
{
foreach (var property in fromEntity.GetType().GetProperties())
{
if (property.GetSetMethod() == null)
continue;
var value = property.GetValue(fromEntity, null);
property.SetValue(toEntity, value, null);
}
}
尽管晚了,但我的问题在于Visual Studio生成了以下代码:
public System.Windows.Forms.ListView myListView;
然而,在ListView显示在GetProperties方法中之前,我必须执行以下操作:
public System.Windows.Forms.ListView myListView { get; set; }
希望这能帮助到其他人。