我们在Vb.Net中编写了一个现有的API作为我们的一些客户使用的类库。现在我们希望改变这种方法并公开一个web api,它反过来会调用类库。
这是它的工作原理,用户将方法名,类名,构造函数和方法的参数作为JSON字符串传递。使用反射我们必须根据传入的名称调用类库。我能够实现创建类的实例并执行该方法。问题是传递方法的参数。因为我们在API中接收json对象的参数,如何将这些数据转换为类库中的方法所接受的类型,我们只能在运行时知道它?
[ActionName("invokeapi")]
[HttpPost]
public IHttpActionResult InvokeAPI([FromBody]Newtonsoft.Json.Linq.JObject pClientData)
{
try
{
PostData obj = Newtonsoft.Json.JsonConvert.DeserializeObject<PostData>(pClientData.ToString());
obj.MethodParameter = Newtonsoft.Json.JsonConvert.DeserializeObject(pClientData.GetValue("methodparam").ToString());
return Ok();
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
public class PostData
{
[DataMember(Name = "classname")]
public string ClassName { get; set; }
[DataMember(Name = "methodname")]
public string MethodName { get; set; }
[DataMember(Name = "parameters")]
public string[] Parameters { get; set; }
[DataMember(Name = "methodparam")]
public object MethodParameter { get; set; }
}
此处, obj.MethodParameter 中的数据属于JArray类型。我们如何根据从客户端传递的类名(ClassName属性)动态地将其转换为所需类型。
答案 0 :(得分:1)
当你收到请求时,你只是用对象做某事是不正确的,但是你在运行时调用来处理请求的实际类取决于你的类型请求?
一个建议就是拥有多种API方法。在一个应用程序中,我们不仅会有DoSomething(object parameter)
这样的方法,而是根据parameter
的类型在运行时确定要做什么。如果我们不在应用程序中执行它,我不确定通过API公开那种接口是否有意义。我们通过调用该方法来指定我们想要调用的方法,而不是通过调用“universal”方法并将参数传递给它来指示我们真正想要调用的方法。
如果您的API的消费者不知道如何实现功能,那也更好。他们只是说他们想做什么。他们不知道用于执行这些功能的类或方法的名称。您的API(与任何其他界面一样)创建抽象。您可以在不更改API的情况下更改实施。
这将是我的第一个建议。这样做,你没有解决问题 - 你让问题消失。
话虽如此:
如果你知道参数需要的类型,你可以这样做 - 为了清晰起见我有点冗长:
var parameterType = typeof(TheParameterType);
var deserialized = JsonConvert.Deserialize(pClientData.GetValue("methodparam").ToString(),
parameterType) as TheParameterType;
这将尝试将字符串反序列化为给定类型,以便将其传递给强类型方法。