2013-03-06 74 views
2
var type = data.ClientBaseObject.GetType(); 
var newClientObject = GetDataContextedObject(type, data.ClientBaseObject); 


private object GetDataContextedObject(Type type, object jobObject) 
    { 
     switch (type.Name.ToUpper()) 
     { 
      case "JOBNUMBER": 
       { 
        return GetObjectFromDataContext<JobNumber>(jobObject); 
       } 
      case "NA_HEADER": 
       { 
        return GetObjectFromDataContext<NA_Header>(jobObject); 
       } 
     } 
     return null; 
    } 

     private object GetObjectFromDataContext<T>(object jobObject) where T: class, IJobID 
     { 
      var newObject = jobObject as T; 
      return _dc.GetTable<T>().FirstOrDefault(j => j.JobID == newObject.JobID); 
     } 

在上面的代码,我想知道是否有一种方法,我可以让GetObjectFromDataContextGetObjectFromDataContext<type>,而不必让每个类的type.Name和创造的情况下,每一个。这可以做到吗?制作一个泛型类型的变量

让我知道如果问题不明确。

+0

你计划如何调用这个方法?如果您向我们展示一些背景可能会有所帮助。 – rcdmk 2013-03-06 22:33:25

+0

已更新代码以获取更多说明 – 2013-03-06 22:38:02

+0

您真的应该考虑检查您的设计。你能发布这个案例的要求吗? – rcdmk 2013-03-06 22:52:20

回答

0

是否所有允许的类型都实现一个通用接口?如果是这样,那么是的;将GetObjectFromDataContext更改为接受基本类型作为通用参数。

但是,必须在编译时确定一个通用参数。否则,该功能如何提供类型安全性?你可能会在这一点上传递所有东西作为object

编辑:根据您的更新。

我你必须能够在运行时传递Type参数,然后不,你不能做你想做的。由于这一切都是在运行时发生的,您将不得不选择调用通用版本。出于同样的原因,您不能使用the overload of GetTable that takes a Type argument;您需要投射,因为它会返回ITable

你真的需要动态使用Type参数吗?

+0

已更新代码以获得更多说明 – 2013-03-06 22:34:36

+0

不必这样做,但我只是想减轻维护的打击。每次添加新课程时都不想再添加额外的案例 – 2013-03-06 22:52:34

+0

可以假设,如果您喜欢痛苦,可以将其重写为基因调用,并在运行时确定通过MakeGenericMethod调用的正确方法... – JerKimball 2013-03-06 23:06:18

0

你可以写这样说:

private object GetDataContextedObject<T>(object jobObject) 
{ 
    return GetObjectFromDataContext<T>(jobObject); 
} 
+0

也许吧。这取决于在方法中如何使用'T'。 – 2013-03-06 22:30:09

+0

我需要澄清我的问题。我不知道我会去哪个班。我会添加更多代码 – 2013-03-06 22:31:09

+0

当然。对于简单的情况,你只想从EF获取数据集,这应该做的工作,但我不能推荐它用于所有情况。 – rcdmk 2013-03-06 22:32:06