![](/img/trans.png)
[英]Invoke a method using reflection with the “params” keyword without arguments
[英]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 case
或if-else
梯形圖。 因此,只要您的類的構造函數期望引用類型(類類型)的參數,此代碼就可以正常工作。
我建議使用Dependency Injection庫,例如Ninject和nuget 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.