我无法理解界面。在这里搜索了类似的问题之后,我想出了以下界面,用于定义我所有类所需的CRUD操作:
public interface IData<T>
{
IData<T> Select(int id);
List<T> SelectMultiple();
void Insert();
void Update();
void Delete();
}
然后在我的部分类中实现:
public partial class Post : IData<Post>
{
public IData<Post> Select(int id)
{
MyDataContext dc = MyDataContext.Create();
return dc.Posts.Single(p => p.PostID == id);
}
public List<Post> SelectMultiple()
{
MyDataContext dc = MyDataContext.Create();
return dc.Posts.ToList();
}
// Update() and Delete() declarations
}
这一切都很好,但是如果我尝试使用Post Select()方法:
Post p = new Post().Select(1);
它失败并且无法将类型'IData'隐式转换为'Post'。存在显式转换(您是否错过了演员?)
哪个有道理,但我如何才能使它不需要演员?我希望Select返回一个帖子(但不要将Post定义为接口级别的返回类型)。我是否误解了界面,或者我可以做出快速修改?
答案 0 :(得分:10)
你想要返回T
类型的内容,而不是IData<T>
,所以只需更改签名(至少我想这就是你想要的,否则你将返回List<IData<T>>
):
public interface IData<T>
{
T Select(int id);
List<T> SelectMultiple();
void Insert();
void Update();
void Delete();
}
并适当地实施:
public Post Select(int id)
{
MyDataContext dc = MyDataContext.Create();
return dc.Posts.Single(p => p.PostID == id);
}
如果您只想在Post类中使用此行为,请显式实现IData<T>
接口:
public partial class Post : IData<Post>
{
public Post Select(int id)
{
MyDataContext dc = MyDataContext.Create();
return dc.Posts.Single(p => p.PostID == id);
}
IData<Post> IData<Post>.Select(int id)
{
return Select(id);
}
}
答案 1 :(得分:3)
您需要更改方法以返回Post
个实例,然后添加返回接口的显式接口实现。
例如:
public partial class Post : IData<Post> {
Post Select(int id) { ... }
IData<Post> IData<Post>.Select(int id) { return Select(id); }
}
答案 2 :(得分:1)
尝试
怎么样?public Post Select(int id)
{
MyDataContext dc = MyDataContext.Create();
return dc.Posts.Single(p => p.PostID == id);
}
即,直接返回Post
而不是IData<Post>
。
答案 3 :(得分:1)
您应该明确实施IData<Post>.Select
并为您自己的Select
提供适当的返回值。例如:
IData<Post> IData<Post>.Select(int id)
{
return Select(id);
}
Post Select(int id)
{
MyDataContext dc = MyDataContext.Create();
return dc.Posts.Single(p => p.PostID == id);
}
但是,如果你这样做:
IData<Post> post = new Post();
Post p = post.Select(1);
post.Select(1)
仍会返回IData<Post>
。有关允许此操作的界面重构,请参阅Femaref's answer。