我为此接口编码
public interface IRepository
{
IEnumerable<T> GetAll<T>();
}
我有这堂课
public class Customer
{
public int Id { get; set; }
public string CNPJ { get; set; }
public string Name { get; set; }
public string BusinessArea { get; set; }
}
和
public class CustomerRepository : IRepository
{
public IEnumerable<T> GetAll<T>()
{
foreach (var line in this.data)
{
string[] CustomerData = Regex.Split(line, @"\s+(?=002#)");
foreach (var CustomerItem in CustomerData)
{
string[] d = Regex.Split(CustomerItem, "#");
yield return new Customer() { BusinessArea = d[3], CNPJ = d[1], Name = d[2] };
}
}
}
}
我想将GetAll用于加载Others类,但是编译器显示此错误“无法将类型'Prova.Domain.Customer'隐式转换为'T'”
我尝试使用(T)进行Cast,但我无法解决。我该如何解决这种通用演员表?
谢谢
答案 0 :(得分:1)
IRepository
应该是通用(IRepository<T>
),而CustomerRepository
应该实现IRepository<Customer>
:
public class CustomerRepository : IRepository<Custom>
然后您将创建另一个实现IRepository<Other>
并返回Other
对象的存储库。
泛型与编译时安全性有关。这与从一种类型“转换”到另一种类型无关。
答案 1 :(得分:1)
在界面中指定通用名称:
public interface IRepository<T> where T : class
以及您的班级:
public class CustomerRepository<T> : IRepository<T> where T : class
答案 2 :(得分:1)
您的存储库应该是通用的,而不仅仅是方法:
public interface IRepository<T>
{
IEnumerable<T> GetAll();
}
public class CustomerRepository : IRepository<Customer>
{
public IEnumerable<Customer> GetAll()
{
foreach (var line in this.data)
{
string[] CustomerData = Regex.Split(line, @"\s+(?=002#)");
foreach (var CustomerItem in CustomerData)
{
string[] d = Regex.Split(CustomerItem, "#");
yield return new Customer() { BusinessArea = d[3], CNPJ = d[1], Name = d[2] };
}
}
}
}
由于您的CustomerRepository
为Customer
对象提供了特定的实现,因此,正如您所观察到的那样,该方法本身无法保持通用。