我想基于现有对象和白名单动态创建匿名对象。
例如,我有以下课程:
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
};
有没有办法实现这个目标?
答案 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类的实例?