将Json对象作为System.object或Interface类型的对象传递不起作用

本文关键字:对象 类型 不起作用 Interface object Json System | 更新日期: 2023-09-27 17:53:53

类别:

公共类ClassNameA:ISomeInterface{}公共类ClassNameB:ISomeInterface{}

来自javascript:

var reqP = { 'Id': id, 'Name':name };
var ReqParams = { 'ReqParams': reqP };
var obj = { 'ClassNameA': ReqParams };
makeAjaxCall("POST",
        JSON.stringify(obj), '/ControllerName/someMethod/', 'html',

操作方法看起来像:

public ActionResult someMethod(object obj){
    // call comes to this method but obj is not populated. 
}
public ActionResult someMethod(ISomeInterface obj){
    // call comes to this method but throws exception. 
    // Exception : Cannot instantiate interface. but i am passing class object.
}

从JavaScript中,我将传递实现ISomeInterface的具体类类型的对象,这样我就可以有多个实现。混凝土等级可以是这两种类型中的任何一种。

有什么建议吗?

将Json对象作为System.object或Interface类型的对象传递不起作用

那行不通。模型绑定器需要一个具体类型才能创建实例并绑定值。

object是一个具体类型,可以使用Activator.CreateInstance创建,但它没有任何与您接收的数据匹配的属性。

无法创建接口(或抽象类型(,因为它们不是具体类型。就这么简单。

如果JSON包含一些关于类型的提示,则可能实现一个自定义模型绑定器来为您创建实例。您可以在此处阅读有关模型绑定过程的更多信息。

默认的模型绑定器将无法确定该做什么。让我们通过一些示例接口来了解原因。假设你有这个:

public ActionResult SomeMethod(ISomeInterface obj)
{
    // ...
}

并假设您有以下两种实现:

class ClassA : ISomeInterface
{
    public string Name { get; set; }
    public string Phone { get; set; }
}
class ClassB : ISomeInterface
{
    public string Name { get; set; }
    public string Email { get; set; }
}

并说这个JSON发布了:

{ "Name": "Some Value" }

模型绑定器如何知道要使用哪个类?它会在所有程序集中搜索所有定义的类来查找接口的所有实现吗?如果是这样的话,即使它有基于属性的智能选择逻辑,它将如何在两者兼容的ClassAClassB之间进行选择?

您可能想要做的是使用像Dictionary<string, object>这样的类型,您知道它是兼容的dynamic,或者使用一个具体的类,它是您所需要的一切的并集。或者,您可以创建一个自定义模型绑定器,该绑定器具有自己的逻辑,用于选择要实例化的类。有关详细信息,请参阅此问题。