gpt4 book ai didi

c# - 设计建议 - 如何将这些方法转换为利用 C# 泛型

转载 作者:行者123 更新时间:2023-11-30 20:11:37 26 4
gpt4 key购买 nike

在我的整个应用程序中,我有许多加载集合的方法。它们都(实际上大多数有几个差异)遵循以下模式:

public BaseCollection<ObjectType1> LoadObjectType1(EventHandler handleEvent)
{
var myQuery = ObjectType1.Load(MyServiceContext);
return new DataManager<ObjectType1>().GetData(myQuery , handleEvent, MyServiceContextt);
}

public BaseCollection<ObjectType2> LoadObjectType2(EventHandler handleEvent)
{
var myQuery = ObjectType2.Load(MyServiceContext);
return new DataManager<ObjectType2>().GetData(myQuery , handleEvent, MyServiceContextt);
}

public BaseCollection<ObjectType3> LoadObjectType3(EventHandler handleEvent)
{
var query = ObjectType3.Load(MyServiceContext);
return new DataManager<ObjectType3>().GetData(query, handleEvent, MyServiceContextt);
}

其中 ObjectType# 是我的业务对象,例如员工、部门等

我想将它们转换为利用泛型。

任何建议将不胜感激。

最佳答案

您始终可以创建这些函数本身采用通用参数的版本。但是,由于没有参数可以让编译器推断泛型参数的类型,因此您始终必须在调用中提供它。

主要问题是,您使用的是在每个对象类型上实现的静态 Load 方法。您必须将此作为委托(delegate)传递给调用:

public BaseCollection<T> Load<T>(EventHandler handleEvent, Func<QueryType> querySelector) 
{
var myQuery = querySelector(MyServiceContext);
return new DataManager<T>().GetData(myQuery , handleEvent, MyServiceContext);
}

调用这些版本时,您必须指定类型 T,并传入一个委托(delegate),该委托(delegate)将返回您用来加载数据的查询对象(因为它是特定类型的):

LoadDepositionSampleTypeItemSource<Department>( handler, Department.Load );

编辑:所以,现在您已经更新了您的问题,我想我理解得更好了。没有理由不能将不同的方法分解为一个重载。如果您可以重构实现,以便不从对象类型中检索查询,则您可以进一步改进和巩固。工厂模式可以让事情变得更干净、更易于维护:

public BaseCollection<T> Load<T>(EventHandler handleEvent) 
{
var myQuery = QueryManager.GetQuery<T>(MyServiceContext);
return new DataManager<T>().GetData(myQuery , handleEvent, MyServiceContext);
}

关于c# - 设计建议 - 如何将这些方法转换为利用 C# 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3533027/

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