使用字符串在运行时创建T而不会丢失intellisense

时间:2014-08-06 00:43:49

标签: c# asp.net .net asp.net-mvc-4

我有一个客户端/服务器应用程序,客户端从服务器请求一些数据。为此,客户端发送一个数据请求,其中包含要从中收集数据的对象名称。这是使用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)当服务器返回对象时,这也是一场噩梦,因为稍后在服务器脚本中我需要做一些一致性而且我没有智能感知来帮助。

我想用一些技巧解决这个问题,但我不知道该往哪里去。我尝试过反思,但为了这样做,我仍然失去了智能感知。

任何标准/方法/实践或模式可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

为什么不将服务器定义为:

 //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();
 }

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

棘手的部分是我不知道DataManager所做的一切,所以我不能进一步建议。为什么所有类型的差异都是决定因素。