我知道这个问题已被多次询问过。但是看看答案,我找不到合适的答案,或者找一个适合我的答案。
我们说我有一个抽象类
public abstract class EntityService<T>
{
public T GetAll()
{
//Implementation
}
}
然后我有一个开车的课程
public class UserService : EntityService<User>
{
public User GetAll(string Orderby)
{
//Implementation
}
}
我创建了一个UserService的静态变量,以便在我的项目中使用它。
public static readonly EntityService<User> UserService = new UserService();
使用UserService.GetAll();
可以完美地运行。但是,当我想使用UserService.GetAll("Acsending");
时,会给出编译器错误,指出此方法不存在。我知道我必须将其转换为UserService Type,但我无法做到。我把它放在哪里(UserService)它总是给出错误,我想知道有没有更好的方法来做到这一点而不强制它,因为我想尽可能简单和简单地编写我的代码。
答案 0 :(得分:2)
我认为你的情况会像这样做有用,抱歉有点迟了,但是:
<div id="content">
<nav id="navlist" class="logo-center nav-overlay">
<div class="row">
<div class="medium-4 columns text-right">
<ul class="menu ">
<li><a href="index.php " id="homenav">Home</a>
</li>
<li><a href="reserve.php " id="reservenav">Reservations</a>
</li>
<li><a href="menus.php " id="menusnav">Menus</a>
</li>
</ul>
</div>
<div class="medium-4 columns text-center">
<a href="index.php ">
<img alt=" " src="img/logo_medium.png" class="logo medium-7 ">
</a>
<a href="index.php ">
<img alt=" " src="img/logo-dark.png" class="logo logo-dark medium-10 ">
</a>
</div>
<div class=" medium-4 columns text-left ">
<ul class="menu ">
<li><a href="location.php " id="locationnav">Find us</a>
</li>
<li><a href="history.php " id="historynav">History</a>
</li>
<li><a href="contact.php " id="contactnav">Contact</a>
</li>
</ul>
</div>
<div class="nav-toggle "><i class="icon icon_menu "></i>
</div>
</div>
</nav>
</div>
然后像这样使用它:
public interface IUserService
{
User GetAll();
User GetAll(string OrderBy);
}
public abstract class EntityService<T>
{
public T GetAll()
{
//Implementation
}
}
public class UserService : EntityService<User>, IUserService
{
public User GetAll(string OrderBy)
{
//Implementation
}
}
然后,如果你想要一些实体的通用代码,你可以这样写:
public static readonly IUserService UserService = new UserService();
....
UserService.GetAll();
UserService.GetAll("orderByColumn");
如果用户特殊,即:
void ForEntityMethod(EntityService<T> entityService)
它认为它可以为您提供更大的灵活性,并避免在您的情况下投射。 还存在另一个好的变体,但如果你有一些未来的系统愿景,它们就可以使用。
答案 1 :(得分:1)
您需要将变量声明为子类,如下所示:
public static readonly UserService userService = new UserService();
或者,每次要使用EntityService<User>
作为UserService:
var userServiceDownCast = (UserService)userService;
userServiceDownCast.GetAll("Ascending");