C# 首先以编程方式打开.NET EF代码上的属性序列化

C# 首先以编程方式打开.NET EF代码上的属性序列化,c#,asp.net,entity-framework,asp.net-web-api,asp.net-web-api2,C#,Asp.net,Entity Framework,Asp.net Web Api,Asp.net Web Api2,我在EF 6上使用CodeFirst对数据进行建模。 我正在构建一个Web API,不同类型的客户端可以访问该API,但根据客户端的配置,他们应该看到或不看到模型的某些属性 ?如何打开或关闭[JsonIgnore]或[serialized]?是否可以设置一组特定的规则来执行此操作,如验证程序?选项1:使用自定义ContractResolver 您可以创建自定义合同解析程序,并在创建响应时使用它: public class TestContractResolver : DefaultContrac

我在EF 6上使用CodeFirst对数据进行建模。 我正在构建一个Web API,不同类型的客户端可以访问该API,但根据客户端的配置,他们应该看到或不看到模型的某些属性

?如何打开或关闭
[JsonIgnore]
[serialized]
?是否可以设置一组特定的规则来执行此操作,如验证程序?

选项1:使用自定义ContractResolver 您可以创建自定义合同解析程序,并在创建响应时使用它:

public class TestContractResolver : DefaultContractResolver
{
    public string ExcludeProperties { get; set; }
    protected override IList<JsonProperty> CreateProperties(Type type,
                                           MemberSerialization memberSerialization)
    {
        if (!string.IsNullOrEmpty(ExcludeProperties))
            return base.CreateProperties(type, memberSerialization)
                        .Where(x => !ExcludeProperties.Split(',').Contains(x.PropertyName))
                        .ToList();

        return base.CreateProperties(type, memberSerialization);
    }
}
结果是:

{"Id":1,"LastName":"y"}
{"Id":1,"LastName":"y"}
选项2:使用字典 您可以忽略一个逗号分隔的属性名称字符串,然后选择属性并将其(名称和值)放入字典中,并将其用作结果:

[HttpGet]
public Dictionary<string, Object> Test()
{
    var person = new Person() { Id = 1, FirstName = "x", LastName = "y", Age = 20 };

    string excludeProperties = "FirstName,Age";
    var dictionary = new Dictionary<string, Object>();
    person.GetType().GetProperties()
          .Where(x => !excludeProperties.Split(',').Contains(x.Name)).ToList()
          .ForEach(p =>
          {
              var key = p.Name;
              var value = p.GetValue(person);
              dictionary.Add(key, value);
          });

    return dictionary;
}

如何获得模型的json表示;Add(新的JsonMediaTypeFormatter());config.Formatters.JsonFormatter.SerializerSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver()我正在考虑一种使用数据注释的方法,但我认为使用一个被排除属性的对象序列化到用户声明中,然后将其作为字符串传递给契约将是一个更干净的解决方案。我已经忘了存在一个合同解决者。谢谢,完成了。再次感谢:D
{"Id":1,"LastName":"y"}