在运行时使用字符串创建T,并且不丢失智能感

本文关键字:智能 运行时 字符串 创建 | 更新日期: 2023-09-27 18:16:52

我有一个客户端/服务器应用程序,其中客户端从服务器请求一些数据。为此,客户端发送一个数据请求,其中包含他希望从中收集数据的对象名称。这是使用Ajax字符串完成的。

在服务器端,我有一个通用的DataManager<T>类,从数据库获取数据并返回列出的数据,如下所示:

public class DataManager<T> where T : class, new()
{
    public List<T> DataManager<T>
    {
         .... Get list for object T in database using reflection and return the T objects...
    }
}
因此,我的服务器代码有以下结构来处理客户端请求:
public class Server
{
    public static object GetData(string dataObjectName)
    {
         switch (dataObjectName)
         {
             case "ObjA": 
                var objAManager = new DataManager<ObjA>();
                return objAManager.List();
                break;
             case "ObjB": 
                var objBManager = new DataManager<ObjB>();
                return objBManager.List();
                break;
             default:
                return null;
          }
    }
}

今天我有两个问题:

a)由于我有不同的DataManager类和几十个Objs,我的代码得到了混乱的开关和测试条件。

b)作为服务器返回对象,这也是一个噩梦,因为稍后在服务器脚本中,我需要做一些一致性,我没有智能感知来帮助。

我想用一些技巧来解决这个问题,但我不知道该去哪里。我试着反思,但这样做我仍然失去理智。

有什么标准/方法/实践或模式可以帮助我吗?

在运行时使用字符串创建T,并且不丢失智能感

为什么不直接定义server为:

 //IDataObject is an interface to provide a common contract for all entities used
 public static object GetData<T>()
   where T: IDataObject
 {
     var mgr = new DataManager<T>();
     return mgr.List();
 }

听起来更好的解决方案是实现一个设计模式,比如构建器模式;director找到正确的构建器对象(该对象是用于创建DataManager实例的对象)。或者,找到一种通用所有数据管理器的方法,并集中该逻辑。

棘手的部分是我不知道DataManager做的一切,所以我不能进一步建议。为什么字体的不同会成为决定因素。