C# 使泛型类型成为变量 var type=data.ClientBaseObject.GetType(); var newClientObject=GetDataContextedObject(类型,data.ClientBaseObject); 私有对象GetDataContextedObject(类型,对象jobObject) { 开关(type.Name.ToUpper()) { 案例“工作编号”: { 返回GetObjectFromDataContext(jobObject); } 案例“NA_头”: { 返回GetObjectFromDataContext(jobObject); } } 返回null; } 私有对象GetObjectFromDataContext(对象jobObject),其中T:class,IJobID { var newObject=作为T的作业对象; 返回_dc.GetTable().FirstOrDefault(j=>j.JobID==newObject.JobID); }
在上面的代码中,我想知道是否有一种方法可以将C# 使泛型类型成为变量 var type=data.ClientBaseObject.GetType(); var newClientObject=GetDataContextedObject(类型,data.ClientBaseObject); 私有对象GetDataContextedObject(类型,对象jobObject) { 开关(type.Name.ToUpper()) { 案例“工作编号”: { 返回GetObjectFromDataContext(jobObject); } 案例“NA_头”: { 返回GetObjectFromDataContext(jobObject); } } 返回null; } 私有对象GetObjectFromDataContext(对象jobObject),其中T:class,IJobID { var newObject=作为T的作业对象; 返回_dc.GetTable().FirstOrDefault(j=>j.JobID==newObject.JobID); },c#,generics,C#,Generics,在上面的代码中,我想知道是否有一种方法可以将GetObjectFromDataContext转换为GetObjectFromDataContext,而不必获取每个类的type.Name并为每个类创建一个case。这能做到吗 如果问题不清楚,请告诉我。所有允许的类型是否都实现了公共接口?如果是,那么是;更改GetObjectFromDataContext以接受基类型作为泛型参数 但是,泛型参数必须在编译时确定。否则,该功能将如何提供类型安全性?在这一点上,您可以将所有内容作为对象进行传递 编辑:根
GetObjectFromDataContext
转换为GetObjectFromDataContext
,而不必获取每个类的type.Name并为每个类创建一个case。这能做到吗
如果问题不清楚,请告诉我。所有允许的类型是否都实现了公共接口?如果是,那么是;更改
GetObjectFromDataContext
以接受基类型作为泛型参数
但是,泛型参数必须在编译时确定。否则,该功能将如何提供类型安全性?在这一点上,您可以将所有内容作为对象进行传递
编辑:根据您的更新
I您必须能够在运行时传入类型
参数,然后不,您不能做您想做的事情。因为这都是在运行时发生的,所以您必须有选择地调用通用版本。您不能出于同样的原因使用;您将需要强制转换,因为它返回ITable
您真的需要使用类型参数动态执行此操作吗?您可以这样编写:
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);
}
私有对象GetDataContextedObject(对象jobObject)
{
返回GetObjectFromDataContext(jobObject);
}
也许吧。这取决于方法中如何使用T
。我想我需要澄清我的问题。我不知道我要上哪门课。我会添加更多的代码。对于简单的情况,如果您只想从EF获取数据集,这应该可以完成工作,但我不建议在所有情况下都使用它。我添加了更多代码以进行说明。我正在调用一个GetType()来获取类型。如果这样做有效,那么包装器将毫无用处。但是,由于以下原因,它将不起作用:.FirstOrDefault(j=>j.JobID==newObject.JobID)代码>您计划如何调用此方法?如果你给我们看一些上下文,它可能会帮助。更新代码,以澄清更多,你真的应该考虑审查你的设计。你能发布这个案例的要求吗?不必这样做,但我只是想减轻维护的负担。不想每次添加一个新类时都添加一个额外的case,如果您喜欢pain,您可以将其重写为一个genetic调用,并在运行时通过MakeGenericMethod确定要调用的正确方法…@DJBurb,如果持有此方法的类被调用Foo
和方法签名public void Bar()
,对于任何typet
,您都可以找到正确的方法,比如typeof(Foo).GetMethod(“Bar”).MakeGenericMethod(t)
——我必须强调这是一个反射调用,可能比您希望的要慢。
private object GetDataContextedObject<T>(object jobObject)
{
return GetObjectFromDataContext<T>(jobObject);
}