5

匿名型に含まれる必要があるプロパティがリストされている 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 });
    }
}
4

3 に答える 3

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);
    }
}
于 2013-02-19T10:03:25.220 に答える
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"
      }
   ]
]
于 2013-02-19T09:45:29.967 に答える
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;
    }
}

使用例はこちら

于 2013-02-20T10:50:58.470 に答える