我正在尝试创建一个通用接口,这将允许我与数据库进行交互的方法。我希望我的业务应用程序能够实例化任何连接方法,并确保界面完全相同。使用另一个接口从接口实现通用方法
下面是我现在尝试的简化版本。
数据库接口其中IElement
是定义表的另一个接口。
public interface IDatabase
{
void setItem(IElement task); //this works fine
List<T> listTasks<T>() where T : IElement; // this doesn't
}
IElement接口:
public interface IElement
{
int id { get; set; }
}
IElement的执行情况:
public class TaskElement: IElement
{
public int id { get; set; }
public string name {get; set; }
}
的了IDatabase实现:
public class SQLiteDb: IDatabase
{
public SqLiteDb(SQLiteConnection conn)
{
database = conn;
}
public void setItem(IElement task)
{
// works fine when passed a new TaskElement() which is an implementation of IElement.
database.Insert(task);
}
//it all goes off the rails here
public List<T> listItems<T>() where T : IElement
{
var returnList = new List<IElement>
foreach (var s in database.Table<TaskElement>())
{ returnList.Add(s); }
return returnList;
}
我已经尝试了很多的变化上这一点,但每一个给我一个新的是起诉。例如,在这里有两个错误。
1)
的类型参数方法
'SQLiteDb.listTasks<T>()'
不能从使用推断。尝试明确指定类型参数。
2)
无法隐式转换类型
'System.Collections.Generic.List<TaskElement>'
到'System.Collections.Generic.List<T>'
我试着改变使用显式类型的方法,但也有过问题。如果我使用IElement
(我所有元素的通用接口),我无法返回TaskElement对象的列表(我的实现为IElement
),因为它与返回类型(List<IElement>
)不匹配,并且如果我将返回类型更改为List<TaskElement>
I不再实现接口。
值得注意的是,如果我停止使用接口和泛型,我可以很容易地实现这一点,但这似乎是使用接口的理想情况。当另一个应用程序(如直接继承)可能更好时,也许我试图将很多东西塞进界面中?
问题
我怎么能同时限制它可以返回到另一个接口的唯一实现的类型实现一个通用的返回值的接口。
您是否尝试过'var returnList = new List();' –
只是为了注意,看看您的TaskElement,因为您正在实现一个接口,您必须使Id公开(因为默认情况下,c#将其设置为私有) – ams4fy
与你的问题没有任何关系,但如果你刚刚启动c#,你应该阅读[编码约定](https://msdn.microsoft.com/en-gb/library/ff926074.aspx)其他开发人员会感谢您! – Jamiec