【发布时间】:2012-01-07 03:20:34
【问题描述】:
我在将实体转换为要在静态方法中使用的接口时遇到问题。我得到的错误是 InvalidCastException。我需要执行此转换,因为我有一个需要采用特定接口定义的静态方法。我认为(尽管我没有尝试过)使用抽象类而不是接口可能会起作用,但是 C# 不支持从抽象类继承,并且我的实体已经从一个抽象类继承。
我的模型相当简单。我有一个实体对象 - MemberStatus - 它有一个 Id、Name 和 DisplayOrder。它继承自 Entity 抽象类(继承自 IIdentifiableEntity)并实现 INamedEntity、IOrderedEntity 接口。这些抽象类或接口中的每一个都只包含一个属性(Id、Name 和 DisplayOrder)。
这是我的域项目中的代码:
public abstract class Entity : IIdentifiableEntity
{
public int Id { get; set; }
}
public interface INamedEntity
{
string Name { get; set; }
}
public interface IOrderedEntity
{
float DisplayOrder { get; set; }
}
public class MemberStatus : Entity, INamedEntity, IOrderedEntity
{
public string Name { get; set; }
public float DisplayOrder { get; set; }
}
public interface IRepository<TEntity>
{
TEntity FindById(int id);
bool InsertOrUpdate(TEntity entity);
//... More methods here
}
这是我的静态方法(我希望能够用于任何 IOrderedEntity):
public static void MoveDisplayOrder(IRepository<IOrderedEntity> repository, int id, bool moveUp)
{
var currentStatus = repository.FindById(id);
//...do reordering work
repository.InsertOrUpdate(currentStatus);
}
在我的 MVC 控制器中(在我的 Web 项目中),我有以下内容:
public class AdminController : Controller
{
private readonly IRepository<MemberStatus> _memberStatusRepository;
public AdminController(IRepository<MemberStatus> memberStatusRepository)
{
_memberStatusRepository = memberStatusRepository;
}
public ActionResult StatusMoveDisplayOrder(int id, bool moveUp)
{
// Code fails on the following line...
MoveDisplayOrder((IRepository<IOrderedEntity>) _memberStatusRepository, id, moveUp);
return RedirectToAction("Index");
}
// Rest of controller code here...
}
当控制器调用 StatusMoveDisplayOrder 并反过来尝试调用静态 MoveDisplayOrder 时,代码会失败(在运行时...它可以正常编译)。在我将 MoveDisplayOrder 设为静态并将第一个参数从 IRepository<MemberStatus> 更改为 IRepository<IOrderedEntity> 之前,所有这些代码都运行良好。同样,我进行了更改,以便可以在任何具有 DisplayOrder 属性的实体上调用此方法(实现 IOrderedEntity)。我做错了什么?
仅供参考 - 我正在使用 ninject,以防我需要调整其中的内容。
【问题讨论】:
-
“C# 不支持从抽象类继承”?不太清楚你的意思,也许你的意思是 C# 不支持 multiple 继承?它肯定支持从抽象类继承。
-
这就是我的意思,如果我没有说清楚的话。
标签: c# c#-4.0 interface static-methods .net