【问题标题】:creating T at runtime using strings and not losing intellisense在运行时使用字符串创建 T 而不会丢失智能感知
【发布时间】:2014-08-06 00:43:49
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

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

 //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 所做的一切,所以我无法提供进一步的建议。为什么所有类型的差异都是决定因素。

【讨论】:

  • DataManager 进入数据库,找到与其名称相关联的表,将表数据与对象属性进行映射,等等……大量的“算法”工作……
  • Method&lt;T as SomeType&gt; 不是有效的 C# 语法
  • 谢谢,我在工作中被困在 VB 世界中 :-) 已修复
猜你喜欢
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
相关资源
最近更新 更多