我将实体框架实体实现为MVC应用程序模型的包装器遇到了障碍。包装器被定义为抽象泛型类,如下所示:
public abstract class EntityModel<E> : IValidatableObject
{
public Int64 ID { get; protected set; }
public abstract IEnumerable<ValidationResult> Validate(ValidationContext
validationContext);
public abstract IEnumerable<ValidationResult> EntityAdd();
public abstract IEnumerable<ValidationResult> EntityUpdate();
public abstract IEnumerable<ValidationResult> EntityDelete();
/* public static abstract IEnumerable<EntityModel<E>> EntityGetList(
Expression<Func<E, bool>> matchPredicate); */
}
显然,注释掉的部分有一个基本的缺陷,即静态和抽象方法,C#不允许,即使在泛型类中也是如此。方法EntityGetList旨在在没有EntityModel&lt; E&gt;的实例的情况下被调用,以获取IEnumerable&lt; EntityModel&lt; E&gt;&gt;满足matchPredicate条件,如下:
public class MyEntityModel : EntityModel<MyEntity>
{
public static IEnumerable<MyEntityModel>
EntityGetList(Expression<Func<MyEntity, bool>> matchPredicate)
{
/* implementation details here, usually involving a LINQtoEntities call
with .Where(matchPredicate).ToList() and a foreach() that converts
the list of MyEntity to a list of MyEntityModel */
}
}
// elsewhere ...
IEnumerable<MyEntityModel> partialViewModel = MyEntityModel.EntityGetList(e =>
e.MyEntityProperty == value);
由于EntityGetList是用于获取EntityModel派生类的实例以进行操作的方法之一,因此需要一个MyEntityModel实例来获取它的无关实例列表是没有意义的。 / p>
问题是,有没有办法将EntityGetList添加到模板中,要求派生类实现它?改变EntityModel&lt; E&gt;因为已经包含了非抽象的方法,因为我已经为了简洁而没有列出,例如EntitySave(),它试图调用EntityUpdate(),如果失败了,EntityAdd (),如果两者都失败,则返回两次尝试产生的ValidationResults列表。我一直在想应该有一种方法来声明一个像抽象方法一样的泛型静态方法,但我一直在绘制一个空白和/或编译器错误。