将IList <T>转换为IList <MyObjectType>

时间:2020-01-15 15:46:27

标签: c# casting

我为此接口编码

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,但我无法解决。我该如何解决这种通用演员表?

谢谢

3 个答案:

答案 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] };
            }
        }
    }
}

由于您的CustomerRepositoryCustomer对象提供了特定的实现,因此,正如您所观察到的那样,该方法本身无法保持通用。

相关问题