.NET - 将属性列入匿名对象的白名单

时间:2016-05-20 12:32:39

标签: c# .net types properties casting

我想基于现有对象和白名单动态创建匿名对象。

例如,我有以下课程:

class Person
{
    string FirstName;
    string LastName;
    int Age;
}

现在我创建了一个函数FilterObject,根据obj参数创建一个新的匿名whitelist,如下所示:

public static class Filter
{
    public static object FilterObject(Person input, string[] whitelist)
    {
        var obj = new {};

        foreach (string propName in whitelist)
            if (input.GetType().GetProperty(propName) != null)
                // Pseudo-code:
                obj.[propName] = input.[propName];

        return obj;
    }
}

// Create the object:
var newObj = Filter.FilterObject(
    new Person("John", "Smith", 25), 
    new[] {"FirstName", "Age"});

结果应如下所示。我想将此对象用于我的Web API。

var newObj = new
{
    FirstName = "John",
    Age = 25
};

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用ExpandoObject(.net 4或更高版本):

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

static class Filter
{
    public static object FilterObject(Person input, string[] whitelist)
    {
        var o = new ExpandoObject();
        var x = o as IDictionary<string, object>;

        foreach (string propName in whitelist)
        {
            var prop = input.GetType().GetProperty(propName);

            if (prop != null)
            {
                x[propName] = prop.GetValue(input, null);
            }
        }

        return o;
    }
}

这只是基于您的代码的示例,但它是一个很好的起点。

答案 1 :(得分:1)

使用词典怎么样?

public static object FilterObject(Person input, string[] whitelist)
{
    var obj = new Dictionary<string, object>();

    foreach (string propName in whitelist)
    {
        var prop = input.GetType().GetProperty(propName);

        if(prop != null)
        {
            obj.Add(propName, prop.GetValue(input, null));
        }
    }               

    return obj;
}

另一件事,你真的需要返回一个对象吗?因为如果您一直在检查Person类型中存在的白名单中的属性,为什么不返回Person类的实例?