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)