Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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