【问题标题】:How to use reflection to call a API by string name?如何使用反射通过字符串名称调用 API?
【发布时间】:2017-11-03 08:38:10
【问题描述】:

如何通过字符串名称调用另一个AppService中的API?

示例:我在 MyAppService 中有如下 API

public class MyAppService : MyAppServiceBase, IMyAppService
    {
        private readonly IRepository<MyEntity> _myEntityRepository;    
        public CommonLookupAppService(IRepository<MyEntity> myEntityRepository)
            {
                 _myEntityRepository = myEntityRepository;            
            }

        public async Task<MyOutput> MyMethod (MyInput input)
            {

            }
    }

如何将MyMethod作为字符串保存到数据库中并在另一个应用服务中调用?我有很多这样的方法,所以我不想使用switch case 来调用它们。我想将此方法程序集名称作为字符串保存到数据库中,并在需要时调用它。我该怎么办?

【问题讨论】:

  • 至少知道AppService 吗?
  • 是的,目前我在 switch 案例中直接调用 api。但我更喜欢使用反射而不是一长串代码

标签: reflection aspnetboilerplate


【解决方案1】:

您可以使用以下组合:

  • Type.GetType(string)
  • Type.GetMethod(string)
  • IIocResolver.ResolveAsDisposable(Type) — 来自 ABP
  • MethodInfo.Invoke(Object, Object[])
// var appServiceName = "MyAppService";
// var methodName = "MyMethod";
// var input = new object[] { new MyInput() };

var appServiceType = Type.GetType(appServiceName);
var method = appServiceType.GetMethod(methodName);

using (var appService = IocResolver.ResolveAsDisposable(appServiceType))
{
    var output = await (Task)method.Invoke(appService.Object, input);
}

【讨论】:

  • 是否也可以将“MyAppService”作为字符串保存到数据库中?
  • 或者你可以写类似stackoverflow.com/a/14112860/2504064
  • @tiennguyen 这解决了一个完全不同的(子)问题,需要您手动注册组件...
  • @aaron 因为应用服务的名称是动态生成的,不是吗?
  • 组件名是动态生成的,每次启动都不一样。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2020-11-04
相关资源
最近更新 更多