基于属性列表过滤的现有对象创建新对象

时间:2012-09-22 04:28:22

标签: c# asp.net reflection

我想根据列表从对象中删除所有属性。

原因是在我的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

2 个答案:

答案 0 :(得分:2)

我不认为这是可能的,因为你要求,你试图返回一种动态对象,但必须输入函数的返回类型,因此,必须明确定义它的属性(尽管可能是可以为空的)。

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

答案 1 :(得分:1)

如果你选择使用JSON序列化,你可以创建一个字典,比如@Randolf R-F说。然后字典将获得serialized into an object, if you use 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类完成反序列化。