以下代码是否有通用解决方案?
public static int SaveReorder(IList<int> listItems)
{
int result = 0;
int order = 1;
Entity1 db = null;
using (ObjectContext context = new ObjectContext())
{
foreach (int id in listItems)
{
db = Get(context, id);
db.Order = order;
context.SaveChanges();
order += 1;
}
result = 1;
}
return result;
}
listItems包含一系列有序的identitykeys。 Entity1是我们EDM中的EntityObjects之一。 Get(...)是同一个类中的一个自定义方法,用于根据当前的ObjectContext和Id获取EntityObject。
我们需要一个针对此实现的通用解决方案,因此我们可以将其应用于多个EntityObjects,其中属性“Order”是所有EntityObjects的公共属性。这可能吗?
答案 0 :(得分:1)
不,但是在将来使用动态关键字的C#4.0中,您可以这样做。
使用订单属性实现界面
目前,您可以拥有一个由每个类实现的订单属性的界面,我不知道如何在EDM中执行此操作,但它并不困难。
我们经常遇到这种问题,这就是为什么C#带有动态类型,我们依赖于接口或反射。
答案 1 :(得分:1)
有两种选择,正如阿卡什已经建议的那样:
让实体实现具有'Order'属性的接口:
interface IEntityOrder {int Order {get;组; }}
partial class Entity1:EntityObject {}
partial class Entity1:IEntityOrder {public int Order {get;组; }
或者使用反射来设置'Order'属性的值(如果是Field的话,则使用FieldInfo):
PropertyInfo pi = db.GetType()。GetProperty(“Order”);
pi.SetValue(db,newValue,null);
答案 2 :(得分:0)
行。谢谢大家的回答。 这是我的解决方案。
public static int SaveReorder<T>(IList<int> listItems) where T : EntityObject
{
int result = 0;
int volgorde = 1;
T entityObject = null;
using (vgplannewEntities objectContext = new vgplannewEntities())
{
try
{
foreach (int id in listItems)
{
entityObject = objectContext.GetEntityByKey<T>(id, new String[] { });
PropertyInfo pi = entityObject.GetType().GetProperty("Volgorde");
pi.SetValue(entityObject, volgorde, null);
objectContext.SaveChanges();
volgorde += 1;
}
result = 1;
}
catch
{
result = 0;
}
}
return result;
}