![](/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.