返回首页


不时我需要使用泛型类,但不知道什么通用的参数,直到运行时 - 例如,因为我遍历我发现通过反射类,我从数据库中读取。希望下面的例子将解释我的意思。
想象一下,我有以下三个实体类,其中实施IEntity的接口,可以读库类。

public interface IEntity

{

    int Id { get; set; }



}



public class Customer : IEntity

{

    public int Id { get; set; }

}



public class Product : IEntity

{

    public int Id { get; set; }

}



public class Supplier : IEntity

{

    public int Id { get; set; }

}



public class Repository<TEntity> where TEntity : IEntity, new()

{

    public TEntity Get(int id)

    {

        return new TEntity()

        {

            Id = id

        };

    }

}

现在,让我们说我想读这些项目的一个实例,可能是为了显示给用户。我说,这个例子是做作!一个更为现实的情况也许一个通用的管理工具,允许用户选择查看一个实体的类型,并让他们有机会进入查看实体的ID,但我希望让事情变得简单。
下面的LINQ查询会得到我所有不同类型的实体,但我们如何使用通用repositorynbsp;类来读吗?{C}
我们希望做的是类似下面的东西,这是无效的Ç#
foreach (Type entityType in entityTypes)

{

        var repository = new Repository<entityType>()

        ...

}

我的解决方案是创建一个私有的内部类,它实现了一个私人的内部接口。{体C3}
我们可以创建一个泛型类型,传递我们正在处理的实体的类型,然后创建与泛型类的一个实例activatornbsp;类。{的C4}
这使得我相信这是一个很优雅的解决方案与仿制药的重复出现的问题。大部分的代码是类型安全的,可以由编译器进行检查。有少量的反射,但是又是相当自我控制,并可能本身被包裹在一个静态工具或扩展方法。这种解决方案可能是上面的例子略有矫枉过正,最终可以只创建一个实例库而非InnerRepository,但如果有更通用的电话或使用的类,希望你可以看到他们在这样的内部类封装的好处。

回答

评论会员: 时间:2
J