如何使用反射按字符串名称调用API?

时间:2017-11-03 08:38:11

标签: reflection aspnetboilerplate

如何通过字符串名称在另一个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来调用它们。我想将此方法程序集名称作为字符串保存到数据库,并在需要时调用它。我该怎么办?

1 个答案:

答案 0 :(得分: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);
}