如何返回依赖于fields参数的匿名类型,其中列出了必须包含在匿名类型中的属性?任务实体拥有20多个属性,客户希望获得不同的属性组合。
public class Test
{
public class Task
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
//... more 20 properties
}
public List<Task> Tasks = new List<Task>();
public Test()
{
Tasks.Add(new Task { Id = 1, Name = "Task #1", Description = "Description task #1" });
Tasks.Add(new Task { Id = 2, Name = "Task #2", Description = "Description task #2" });
Tasks.Add(new Task { Id = 3, Name = "Task #3", Description = "Description task #3" });
}
public IEnumerable<object> GetAllTasks(string fields)
{
//if fields == 'Id,Name' then return anonymous type new { Id = t.Id, Name = t.Name }
return Tasks.Select(t => new { Id = t.Id, Name = t.Name });
//if fields == 'Id,Name,Description' then return anonymous type new { Id = t.Id, name = t.Name, Description = t.Description }
return Tasks.Select(t => new { Id = t.Id, Name = t.Name, Description = t.Description });
}
}
答案 0 :(得分:1)
我希望它能帮到你
public List<Task> Tasks = new List<Task>();
public void Test()
{
Tasks.Add(new Task { Id = 1, Name = "Task #1", Description = "Description task #1" });
Tasks.Add(new Task { Id = 2, Name = "Task #2", Description = "Description task #2" });
Tasks.Add(new Task { Id = 3, Name = "Task #3", Description = "Description task #3" });
}
public ActionResult Index()
{
Test();
return Json(GetAllTasks(), JsonRequestBehavior.AllowGet);
}
public IEnumerable<object> GetAllTasks()
{
return Tasks.Select(GetTask);
}
private object GetTask(Task task)
{
dynamic expandoObject = new ExpandoObject();
//your if statment block
if (task.Id == 1)
{
expandoObject.Id = task.Id;
}
expandoObject.Name = task.Name;
expandoObject.Description = task.Description;
var dictionary = expandoObject as IDictionary<string, object>;
return dictionary.ToDictionary(item => item.Key, item => item.Value);
}
查看结果:
[
[
{
"Key":"Id",
"Value":1
},
{
"Key":"Name",
"Value":"Task #1"
},
{
"Key":"Description",
"Value":"Description task #1"
}
],
[
{
"Key":"Name",
"Value":"Task #2"
},
{
"Key":"Description",
"Value":"Description task #2"
}
],
[
{
"Key":"Name",
"Value":"Task #3"
},
{
"Key":"Description",
"Value":"Description task #3"
}
]
]
答案 1 :(得分:1)
您可以尝试使用ExpandoObject
和System.Reflection
:
public IEnumerable<object> GetAllTasks(string[] fields)
{
List<object> response = new List<object>();
Tasks.ForEach((a) =>
{
dynamic expando = new ExpandoObject();
var p = expando as IDictionary<String, object>;
foreach (string item in fields)
{
p[item] = a.GetType().GetProperty(item).GetValue(a);
}
response.Add(expando);
});
return response;
}
示例用法是:
static void Main(string[] args)
{
var test = new Test();
var results = test.GetAllTasks(new[] { "Id"});
foreach (var result in results)
{
Console.WriteLine((result as dynamic).Id);
}
results = test.GetAllTasks(new[] { "Name", "Description" });
foreach (var result in results)
{
var dynamicResult=result as dynamic;
Console.WriteLine("{0} {1}", dynamicResult.Name, dynamicResult.Description);
// The following line will throw an exception
//Console.WriteLine((result as dynamic).Id);
}
}
答案 2 :(得分:0)
在这种情况下,如果Tasks是IQueryable<Task>
并且我们需要从数据源(例如,从数据库)收紧,那么只有那些客户端必需的列(不要使DB服务器过载),在那里很有用是SelectDynamic方法。因此,完成的决定将在这里:
public class Test
{
public class Task
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
//... more 20 properties
}
public IQueryable<Task> Tasks;
public Test()
{
Tasks = new List<Task>
{
new Task {Id = 1, Name = "Task #1", Description = "Description task #1"},
new Task {Id = 2, Name = "Task #2", Description = "Description task #2"},
new Task {Id = 3, Name = "Task #3", Description = "Description task #3"}
}.AsQueryable();
}
public IEnumerable<object> GetAllTasks(string[] fields)
{
var response = new List<object>();
var customTasks = Tasks.SelectDynamic(fields).Cast<dynamic>();
foreach (var t in customTasks.Take(100))
{
dynamic expando = new ExpandoObject();
if (fields.Contains("Id")) expando.Id = t.Id;
if (fields.Contains("Name")) expando.Name = t.Name;
if (fields.Contains("Description")) expando.Description = t.Description;
// ... other properties
response.Add(expando);
}
return response;
}
}
示例用法为here