簡體   English   中英

C# 動態加載通用 class 每個字符串的動態類型參數和強類型結果

[英]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 顯然是在實現接口,而不是我需要的特定類型。

有沒有辦法實現這兩個目標:

  1. 使用字符串名稱來指定每個類型參數。
  2. 最終有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM