Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法让端点在带有C的WebAPI中使用泛型?_C#_.net_Asp.net Core_Asp.net Web Api_Json.net - Fatal编程技术网

C# 有没有办法让端点在带有C的WebAPI中使用泛型?

C# 有没有办法让端点在带有C的WebAPI中使用泛型?,c#,.net,asp.net-core,asp.net-web-api,json.net,C#,.net,Asp.net Core,Asp.net Web Api,Json.net,使用.net内核和newton JSON。我可以使用泛型创建端点吗?我应该如何请求它传递泛型类型 public async Task<JsonResult> SaveSetting<T>([FromBody] Filter<T> model) {} public class Filter<T> { public string GUID { get; set; } public string Name { get; set; }

使用.net内核和newton JSON。我可以使用泛型创建端点吗?我应该如何请求它传递泛型类型

public async Task<JsonResult> SaveSetting<T>([FromBody] Filter<T> model)
{}

public class Filter<T>
{
    public string GUID { get; set; }

    public string Name { get; set; }

    public FilterType FilterType { get; set; }

    public T FilterRequestModel { get; set; }
}

如果真的有办法的话,就不太可能有一个简单的方法来实现这一点。更重要的是,这是非常不可取的。您可能需要根据UI的输入确定T的类型,然后使用JSON绑定将值绑定到该类型。这意味着您将允许您不信任的调用者使您的代码实例化并在其选择的C类型上设置属性,这表示

在没有泛型的情况下,您很有可能使该端点实现您想要的功能:只需使用JObject作为FilterRequestModel对象。如果您确实依赖于实际的C类型来完成您想要的任务,那么在检查指定的类型是否是您希望调用者能够实例化的类型之后,最好让控制器操作使用JObject,并使用一些自定义逻辑根据一些用户输入来翻译它。创建自定义类型的对象后,可以在将其传递到泛型帮助器方法之前将其强制转换为dynamic,并且泛型类型将在运行时自动解析为所创建对象的类型

public async Task<JsonResult> SaveSetting([FromBody] Filter<JObject> model)
{
    Type filterRequestModelType = this.DetermineSafeModelType(model);
    object typedFilterRequestModel = model.FilterRequestModel.ToObject(filterRequestModelType);
    return SaveSettingHelper(model, (dynamic) typedFilterRequestModel);
}

public async Task<JsonResult> SaveSetting<T>([FromBody] Filter<JObject> model, T filterRequestModel) {...}


如果真的有办法的话,就不太可能有一个简单的方法来实现这一点。更重要的是,这是非常不可取的。您可能需要根据UI的输入确定T的类型,然后使用JSON绑定将值绑定到该类型。这意味着您将允许您不信任的调用者使您的代码实例化并在其选择的C类型上设置属性,这表示

在没有泛型的情况下,您很有可能使该端点实现您想要的功能:只需使用JObject作为FilterRequestModel对象。如果您确实依赖于实际的C类型来完成您想要的任务,那么在检查指定的类型是否是您希望调用者能够实例化的类型之后,最好让控制器操作使用JObject,并使用一些自定义逻辑根据一些用户输入来翻译它。创建自定义类型的对象后,可以在将其传递到泛型帮助器方法之前将其强制转换为dynamic,并且泛型类型将在运行时自动解析为所创建对象的类型

public async Task<JsonResult> SaveSetting([FromBody] Filter<JObject> model)
{
    Type filterRequestModelType = this.DetermineSafeModelType(model);
    object typedFilterRequestModel = model.FilterRequestModel.ToObject(filterRequestModelType);
    return SaveSettingHelper(model, (dynamic) typedFilterRequestModel);
}

public async Task<JsonResult> SaveSetting<T>([FromBody] Filter<JObject> model, T filterRequestModel) {...}


您必须为此构建自己的模型绑定器。一个根据数据确定要构建的类型的工具。你知道我可以在哪里找到用于此的样本吗?你认为这将如何工作?您不会在运行时解析泛型,而是在编译时解析它们。你所需要的就是用JObject.like@DavidL.said替换类型T。直接接受JSON即可。@Nestorzin该模型绑定器不起作用。您仍然需要在某个地方提供泛型类型才能编译代码。在您的示例中,您希望从永远不会编译的客户机发送类型,不管是否编译模型绑定器。模型绑定器允许您声明一个泛型类型模型,然后在每个站点上对其进行强类型化。你的例子中没有这样的东西。如果您想使用模型绑定器来封装反序列化,您当然可以,然后该模型将在多个端点之间可用,但这与您的示例不符。您必须为此构建自己的模型绑定器。一个根据数据确定要构建的类型的工具。你知道我可以在哪里找到用于此的样本吗?你认为这将如何工作?您不会在运行时解析泛型,而是在编译时解析它们。你所需要的就是用JObject.like@DavidL.said替换类型T。直接接受JSON即可。@Nestorzin该模型绑定器不起作用。您仍然需要在某个地方提供泛型类型才能编译代码。在您的示例中,您希望从永远不会编译的客户机发送类型,不管是否编译模型绑定器。模型绑定器允许您声明一个泛型类型模型,然后在每个站点上对其进行强类型化。你的例子中没有这样的东西。如果您想使用模型绑定器来封装反序列化,您当然可以,然后该模型将在多个端点之间可用,但这与您的示例不符。谢谢您的帮助。我正在考虑摆脱任何泛型类型,并有一个这样的模型:公共类筛选器{public string GUID{get;set;}公共字符串名称{get;set;}公共筛选器类型筛选器类型{get;set;}公共作业项目筛选器请求模型{get;set;}你认为如何?我认为这是一个好主意。谢谢你的帮助。我正在考虑摆脱任何泛型类型,并有这样一个模型:公共类筛选器{public string GUID{get;set;}公共字符串名称{get;set;}公共筛选器类型筛选器类型{get;set;}公共作业项目筛选器请求模型{get;set;}Wh
你认为呢?我认为这是个好主意。