簡體   English   中英

在構造函數中使用具有不同參數的反射調用類方法?

[英]Invoke Class Method using Reflection with different params in constructor?

您好,我是C#反射的新手,但我遇到以下問題。

我有一個CommandDispatcher類,該類調用某個執行某些操作的Command類。

現在,我使用開關來確定要調用的命令。

我想通過使用反射來調用正確的命令並永久刪除開關來簡化代碼。

但是每個命令在其構造函數中都需要某種服務或更多服務。 我不想改變那部分。 我知道,如果我沒有在構造函數中傳遞任何服務,則代碼可以正常工作。

因此,當每個命令接受一項或多項服務時,我該如何通過反射來調用我的命令。

這是一個更好理解的圖像: 帶有顏色指示器的代碼

我保留了開關的注釋,以方便閱讀。

這是pastebin中的代碼: https : //pastebin.com/AMQeh1zw

我的搜索沒有找到解決我問題的任何方法。

處理用例的最佳方法是使用IoC和DI。

對於現在的反射情況,您可以使用以下代碼確定給定類型的構造函數參數及其類型。

假設有一個類MyClass

public class MyClass
{
     int age;
     double salary;
     public MyClass(int x, double y)
     {
         age = x;
         salary = y;
     }
}

您可以使用以下邏輯獲取有關MyClass所有構造函數的信息

var ctors = typeof(MyClass).GetConstructors();
// assuming class MyClass has only one constructor
var ctor = ctors[0];
foreach (var param in ctor.GetParameters())
{
    Console.WriteLine(string.Format(
        "Param {0} is named {1} and is of type {2}",
        param.Position, param.Name, param.ParameterType));
}

現在,一旦知道了構造函數參數的類型,就可以創建具有分配給它們的值的那些類型的對象,並使用它們按如下方式創建MyClass對象。

var parameters = new List<object>();
foreach (var param in ctor.GetParameters())
{
    var obj = Activator.CreateInstance(param.ParameterType);
    parameters.Add(obj);
}

var myClassObj = Activator.CreateInstance(typeof(MyClass), parameters.ToArray());

您會注意到,這里的限制是您不能設置obj屬性或值,因為它是tyoe object屬性或值。 如果將其轉換為特定類型,則最終將遇到switch caseif-else梯形圖。 因此,只要您的類的構造函數期望引用類型(類類型)的參數,此代碼就可以正常工作。

我建議使用Dependency Injection庫,例如Ninjectnuget link 對於您的目的,您可以使用下一個結構:

此代碼初始化您的依賴注入核心

    var kernel = new StandardKernel();
    kernel.Load(Assembly.GetExecutingAssembly());

和你的開關:

switch (commandName)
        {
            case "RegisterUser":
                RegisterUserCommand registerUser = kernel.Get<RegisterUserCommand>();
                result = registerUser.Execute(commandParameters);
                break;
            case "Login":
                LoginCommand loginCommand = kernel.Get<LoginCommand>();
                result = loginCommand.Execute(commandParameters);
                break;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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