[英]C# dynamically load generic class with dynamic type parameters per strings and strongly typed result
I am attempting to take a JSON file that contains data about a generic class (assembly, class name, type parameter names), and dynamically load and instantiate the specified class. 如果我使用接口作為類型參數,我可以做到這一點。 但是,實現細節不允許我使用 go 這條路線,所以我需要使用特定類型的參數類。
到目前為止,我有以下代碼:
var ci = Invoke.GetClassRef(@"D:\ROCT\Debug\x64 Core\Common Complex Functions.dll", "Namespace.Class");
Type[] typeArgs = { typeof(DoubleABCAry), typeof(FloatABCAry), typeof(Search3Range), typeof(object) };
var _model = ci.GetType().MakeGenericType(typeArgs);
var model = Activator.CreateInstance(_model) as ComplexBaseModel<IModelInput, IModelIOBase, ISearchDimension, object>;
model.Validate();
第 1 行:加載組件和 class。 那里沒問題。
第 2 行:列出我需要通過string[]
指定名稱的類型。
第 4 行: DoubleABCAry
實現IModelInput
; FloatABCAry
實現IModelIOBase
等。
第 4 行將 object 轉換為其基本定義(如圖所示),這不是我想要的。 我想要RGB255ToCIELAB: ComplexBaseModel<DoubleABCAry, FloatABCAry, Search3Range, object>
。
第 5 行顯示 class 被正確理解。 但是,class 顯然是在實現接口,而不是我需要的特定類型。
有沒有辦法實現這兩個目標:
model
強類型解釋?我知道它可以通過動態編譯的代碼來實現,但這是我最后的手段。
我正在使用 C# 9 預覽版。
因此,我認為最終您的問題歸結為您想要加載dynamic
類型,然后將它們視為static
以便您可以使用instance.MyMethod()
語法調用方法。 這是不可能的(AFAIC),因為instance.MyMethod()
被編譯為 IL,此時編譯器不知道instance
是什么。
因此,如果您不知道要調用的方法是什么,則必須 go 完全動態路由,即使用反射 API 調用正確的方法。
因此,您不僅需要提供 class 名稱,還需要提供方法名稱或具有約定,例如always invoke method called 'Validate'
或類似名稱的方法。
下面的一個簡單清單說明了我的觀點:
using System;
using System.Reflection;
namespace Shoes {
public interface IA { }
public class A : IA {}
public interface IB { }
public class B : IB {}
public class SomeKindOfModel<T1, T2> {
}
public class ConcreteModel<T1, T2> : SomeKindOfModel<T1, T2> {
public bool Validate() {
return true;
}
}
public class Program
{
public static void Main()
{
// since i don't have your Invoke.GetClassRef, i just did this, works in .net core
var type = Type.GetType($"Shoes.ConcreteModel`2");
var genType = type.MakeGenericType(new[] { typeof(A), typeof(B) });
var instance = Activator.CreateInstance(genType);
var result = genType.GetMethod("Validate", BindingFlags.Instance | BindingFlags.Public)
.Invoke(instance, null); // instead of null you can pass data etc.
Console.WriteLine(result); // prints True
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.