C# 为什么在web api方法中返回接口时,我使用接口值获取继承类的值?

C# 为什么在web api方法中返回接口时,我使用接口值获取继承类的值?,c#,interface,asp.net-web-api,C#,Interface,Asp.net Web Api,我有一个从接口继承的类,我从web api get Method返回接口,问题是我将继承类的值作为json字符串获取 这是界面 public interface IFoo { string A { get ;set ; } string B { get ; set ; } } public class Child : iFoo { string A { get ; set ; } string B { get ; set

我有一个从接口继承的类,我从web api get Method返回接口,问题是我将继承类的值作为json字符串获取

这是界面

 public interface IFoo
    { 
    string A { get ;set ; } 
    string B { get ; set ; } 
    } 
 public class Child : iFoo
    { 
    string A { get ; set ; } 
    string B { get ; set ; } 
    string C { get ; set ; } 
    string D { get ; set ; } 
    } 
继承类

 public interface IFoo
    { 
    string A { get ;set ; } 
    string B { get ; set ; } 
    } 
 public class Child : iFoo
    { 
    string A { get ; set ; } 
    string B { get ; set ; } 
    string C { get ; set ; } 
    string D { get ; set ; } 
    } 
然后从控制器的GetMethod返回IFoo

 public IFoo GetIFoo()
        {
        return  ChildInstance ; 
        }

当前结果为我提供了继承类和接口的所有值,但我只需要json结果中接口中实现的值

当它点击Json序列化程序时,它并不关心方法的返回类型是什么。它只知道“我有这个东西,让我们看看我能用它做什么”

如果希望序列化程序只包含接口所具有的属性,最好给它一个只包含接口所具有的属性的对象。您可以考虑使用例如AutoPopter将值从<代码>子实例< /代码>复制到这个新对象。


另一种方法更为复杂——实现自己的序列化程序,这样Json序列化程序就没有机会参与其中。

您的方法被约定为返回一个实现
IFoo
的对象。它可以返回实现
IFoo
的任何对象,但不能返回
IFoo
本身,因为不能有接口实例。因此,它返回一个
子对象的实例

然后,JSON序列化程序被赋予这个
Child
实例,并使用反射来计算它的属性。它查找
A-D
,并将它们序列化

如果只想序列化
A-B
,那么必须返回只实现
A-B
的类的实例

说到这里,如果您使用的是ASP MVC,那么请查看。通过将类定义更改为

public class Child : iFoo
{ 
    string A { get ; set ; } 
    string B { get ; set ; }

    [ScriptIgnore]
    string C { get ; set ; } 
    [ScriptIgnore]
    string D { get ; set ; } 
} 

然后您指示JSON序列化程序只序列化
A-B

如果您不介意返回dynamic,可以执行以下操作:

另一方面,只有在使用json序列化程序时,这才是开箱即用的,因此必须指定“accept:application/json”才能工作

public class Person
{
    public string Name { get; set; }
}

public class User : Person
{
    public string Title { get; set; }
    public string Email { get; set; }
}

public dynamic Get()
{
    var user = new User { Title = "Developer", Email = "foo@bar.baz", Name = "MyName" };

    return new { user.Name, user.Email };
}

如果控制器方法的返回类型是接口,则还可以应用操作筛选器仅序列化接口属性。这样,您就可以始终与接口定义保持同步,而不必更改实现接口的类上的任何属性

为此,您首先必须创建一个自定义的
interfacecontractcolver
contract解析器,如下所述:


你能详细介绍一下这个复杂的方法吗,或者发一个链接到某个例子。。。