C# 为什么在web api方法中返回接口时,我使用接口值获取继承类的值?
我有一个从接口继承的类,我从web api get Method返回接口,问题是我将继承类的值作为json字符串获取 这是界面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
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解析器,如下所述:
你能详细介绍一下这个复杂的方法吗,或者发一个链接到某个例子。。。