首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IList<T>转换为IList<MyObjectType>

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

Stack Overflow用户
提问于 2020-01-15 15:46:27
回答 3查看 55关注 0票数 0

我编写了这个接口

代码语言:javascript
复制
public interface IRepository
    {

        IEnumerable<T> GetAll<T>();
    }

我有这门课

代码语言:javascript
复制
public class Customer
    {

        public int Id { get; set; }
        public string CNPJ { get; set; }
        public string Name { get; set; }
        public string BusinessArea { get; set; }

    }

代码语言:javascript
复制
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加载其他类,但是编译器显示此错误“不能隐式地将'Prova.Domain.Customer‘类型转换为'T'”。

我试过用(T)做演员,但我解决不了这个问题。我如何解决这个通用的强制转换?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-15 15:51:55

您的存储库应该是通用的,而不仅仅是方法:

代码语言:javascript
复制
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对象提供了特定的实现,因此该方法本身不能像您正在观察的那样保持泛型。

票数 1
EN

Stack Overflow用户

发布于 2020-01-15 15:51:38

IRepository应该是泛型的(IRepository<T>),CustomerRepository应该实现IRepository<Customer>

代码语言:javascript
复制
public class CustomerRepository : IRepository<Custom>

然后,您将创建另一个实现IRepository<Other>并返回Other对象的存储库。

泛型是关于编译时安全的。这不是从一种类型到另一种类型的“转换”。

票数 1
EN

Stack Overflow用户

发布于 2020-01-15 15:51:48

在接口中指定泛型:

代码语言:javascript
复制
public interface IRepository<T> where T : class

在你们班也是一样:

代码语言:javascript
复制
public class CustomerRepository<T> : IRepository<T> where T : class
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59754913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档