0

我想从基于列表的对象中删除所有属性。

原因是在我的 Web 服务调用中,我的响应对象相当大,我希望能够允许客户端限制从对象返回的属性。

例如

/api/movie/1?filter=Name,Id,Gross

public class MovieResponse
{
     public string Name {get;set;}
     public int Id {get;set;}
     public double Gross {get;set;}
     public string Director {get;set;}
     public Rating Rating {get;set;}
}

我想根据上面看起来像这样的服务调用返回一个对象

public class MovieResponse
{
     public string Name {get;set;}
     public int Id {get;set;}
     public double Gross {get;set;}
}

我假设如果我使用的是 aspnet 或 wcf,我会挂接到请求生命周期中,在我将响应返回给客户端之前我做的最后一件事是运行我的过滤器/行为来过滤并返回将反序列化的新对象转换成 JSON 或 XML

4

2 回答 2

2

我认为这不可能,因为您正在尝试返回一种动态对象,但函数的返回类型必须是类型化的,因​​此,它的属性必须定义良好(尽管可以为)。

您可以尝试返回Dictionary并根据其内容重新创建正确的对象。

于 2012-09-22T04:35:56.163 回答
1

如果您选择使用 JSON 进行序列化,您可以创建一个字典,就像@Randolf RF 所说的那样。如果您使用 Json.NET,那么该字典将被序列化为一个对象

public static Dictionary<string, object> FilterMovie(MovieResponse movie, string[] fields)
{
    var data = new Dictionary<string, object>();
    var movieType = movie.GetType();

    foreach (var field in fields)
    {
        data.Add(field, movieType.GetField(field).GetValue(movie));
    }

    return data;
}

然后,另一方面,可以使用 MovieResponse 类完成反序列化。

于 2012-09-22T04:36:23.710 回答