gpt4 book ai didi

c# - 工厂方法和泛型

转载 作者:太空狗 更新时间:2023-10-29 21:54:44 32 4
gpt4 key购买 nike

我有以下接口(interface)和实现:

public interface IRepository<T>
{
IList<T> GetAll();
}

internal class TrendDataRepository : IRepository<TrendData>
{
public IList<TrendData> GetAll()
{
//.. returns some specific data via Entity framework
}
}

我将有多个实现,它们都通过 Entity Framework 返回不同的数据。在某些时候,我想向用户表示实现 IRepository 接口(interface)的类列表。我使用以下代码执行此操作。这对我来说非常有用。

    public static IEnumerable<string> GetAvailableRepositoryClasses()
{
var repositories = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof (IRepository<>))
select t.Name;

return repositories;
}

但是,我还想创建一个工厂方法,给定一个特定的字符串将返回一个具体的 Repository 类型,并允许我对其调用“GetAll”方法。在伪代码中:

someObject = Factory.CreateInstance("TrendData");
someObject.GetAll();

(我知道这行不通,因为我必须在工厂方法中指定具体类型)。

我需要此功能,因为我想让用户能够将报表绑定(bind)到特定数据源。这样他们就可以开始一个新的报告,其中报告的数据源绑定(bind)到(例如)TrendDataRepository.GetAll() 方法。

但是,也许是因为世界末日越来越近了 ;-) 或者是周五下午,我无法再清晰地思考,我不知道如何意识到这一点。

非常欢迎一些指点。

最佳答案

我建议返回存储库类型的集合而不是名称,并只在 UI 中显示名称:

public static IEnumerable<Type> GetAvailableRepositoryClasses()
{
return Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof (IRepository<>)));
}

然后当用户选择来源时,您可以执行以下操作:

object repository = Activator.CreateInstance(selectedType);

此方法要求每个存储库都有一个默认构造函数。

Activator.CreateInstance返回一个对象,你不能将它转换为你的 IRepository<T>接口(interface),除非你知道通用类型 T你在期待最好的解决方案可能是创建一个非通用的 IRepository您的存储库类也实现的接口(interface):

public interface IRepository
{
IList<object> GetAll();
}

现在您可以将创建的存储库转换为 IRepository :

IRepository repository = (IRepository)Activator.CreateInstance(selectedType);

您可能会创建一个实现以下两者的存储库基类:

public abstract class RepositoryBase<T> : IRepository<T>, IRepository
{
public abstract IList<T> GetAll();
IList<object> IRepository.GetAll()
{
return this.GetAll().Cast<object>().ToList();
}
}

关于c# - 工厂方法和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13991173/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com