Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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# 使方法从动态类型变为泛型_C# - Fatal编程技术网

C# 使方法从动态类型变为泛型

C# 使方法从动态类型变为泛型,c#,C#,我有一个在运行时创建动态类型的方法。这种方法在很大程度上是可行的。代码按原样工作,创建的类型很好。但是,在代码的后面,我需要将此类型用作泛型。这就是我被卡住的地方。使用泛型类型的部分如下所示: mlContext.Model.CreatePredictionEngine<TSrc,TDst>(ITransformer, DataViewSchema) 您根本不需要修改该方法。您需要做的是获取返回的类型,并使用该类型创建一个通用方法,然后使用该方法调用 var dynamicType

我有一个在运行时创建动态类型的方法。这种方法在很大程度上是可行的。代码按原样工作,创建的类型很好。但是,在代码的后面,我需要将此类型用作泛型。这就是我被卡住的地方。使用泛型类型的部分如下所示:

mlContext.Model.CreatePredictionEngine<TSrc,TDst>(ITransformer, DataViewSchema)

您根本不需要修改该方法。您需要做的是获取返回的
类型
,并使用该类型创建一个通用方法,然后使用该方法调用

var dynamicType = DynamicType.CreateDynamicType(properties);
var method = mlContext.Model.GetType().GetMethod("CreatePredictionEngine");
System.Type type2 = ...; // however/wherever you get this instance of Type from
var generic = method.MakeGenericMethod(dynamicType, type2);
var param1 = ...; // however/wherever this comes from
var param2 = ...; // however/wherever this comes from

generic.Invoke(mlContext.Model, param1, param2);
该类型由
CreateDynamicType
方法动态生成与此无关。您可以使用System的任何实例。从任何源键入您调用的实例
MakeGenericMethod

现在,要实际使用您的引擎,请将其分配给
动态
。这允许您动态调用
Predict
方法

dynamic engine = (dynamic)genericMethod.Invoke(mlContext.Model, args);
var dest = engine.Predict(source)
或者,您是对的,您可以为
Predict
创建另一个通用方法,并使用反射调用该方法


在不了解其余代码的情况下,您必须使用
dest
继续动态调用,直到您完成它,除非您可以返回到可以调用普通类型安全C的点。

“。可以在CreatePredictionEngine函数中使用的类型?”除非“
CreatePredictionEngine
TSrc
具有类型约束,否则任何类型都可以与之一起使用,因此您的问题没有任何意义。您是否在询问如何使用刚刚创建的类型调用
CreatePredictionEngine
?看,谢谢@JohnWu。
TSrc
实际上是在请求定义预测引擎输入的类对象。。。在本例中,应该是
CreateDynamicType
中返回的动态类型。因此,我可以通过调用
var dynamicType=dynamicType.CreateDynamicType(属性)来创建此类型的实例
但是我不能使用
dynamicType
作为泛型
TSrc
,因为它说它是一个变量,不能用作类型。我想我只是对如何从运行时之后创建的动态类对象定义
TSrc
感到非常困惑。您还需要动态调用
CreatePredictionEngine
var dynamicType = DynamicType.CreateDynamicType(properties);
var method = mlContext.Model.GetType().GetMethod("CreatePredictionEngine");
System.Type type2 = ...; // however/wherever you get this instance of Type from
var generic = method.MakeGenericMethod(dynamicType, type2);
var param1 = ...; // however/wherever this comes from
var param2 = ...; // however/wherever this comes from

generic.Invoke(mlContext.Model, param1, param2);
dynamic engine = (dynamic)genericMethod.Invoke(mlContext.Model, args);
var dest = engine.Predict(source)