2017-12-07 5 views
-1

私はListを持っており、このExpressionリストで定義された新しいオブジェクトを選択するExpressionのリストを定義できるようにしたいと考えています。List <>からExpression arrayによって新しいオブジェクトを作成する方法

しかし、私は知らない、式リストをdata.Select()に渡す方法。このような いろいろ書い:data.Select(SelectExpressionList)

public class Test 
{ 
    public void Process() 
    { 
     var foo = new Foo<User>(); 

     foo.data.Add(new User() { id = 1, LastName = "User1", Other = "A" }); 
     foo.data.Add(new User() { id = 2, LastName = "User2", Other = "B" }); 
     foo.data.Add(new User() { id = 3, LastName = "User3", Other = "C" }); 

     foo.AddExpression(u => u.id); 
     foo.AddExpression(u => u.LastName); 

     var result = foo.CreateNewByExpression(); // I want List<> object {id, LastName} 

    } 

} 

public class User 
{ 
    public int id { get; set; } 
    public string LastName { get; set; } 

    public string Other { get; set; } 


} 
public class Foo<T> 
{ 

    public List<T> data = new List<T>(); 

    public List<Expression> SelectExpressionsList = new List<Expression>(); 
    public List<object> CreateNewByExpression() 
    { 
     return data.Select(....); // I want List<> object defined by SelectExpressions 
    } 

    public void AddExpression<TKey>(Expression<Func<T, TKey>> exp) 
    { 
     SelectExpressionsList.Add(exp); 
    } 


} 

私はachiveたいものを希望、その明確な、。おかげさまで

編集: 匿名タイプである必要はありません。私は "選択された"プロパティのみを持つリストがほしい...

+1

これはできません。匿名オブジェクトのクラスはコンパイラによって作成されます。コンパイラが完了した後は作成できません。さらに、匿名オブジェクトは、その構造を知っているコードなしでは役に立たないことが判明しました。 – dasblinkenlight

+0

あなたのお返事ありがとうございます。それはAnonymouタイプである必要はありません。私はonyの "選択された"特性を持っているオブジェクトを使っています。 – Celer

答えて

1

ExpandoObjectを使用できます。私のworking exampleを参照してください。

using System; 
using System.Linq; 
using System.Collections.Generic; 
using System.Linq.Expressions; 
using System.Dynamic; 

public class Program 
{ 
    public static void Main() 
    {  
     var foo = new Foo<User>(); 

     foo.data.Add(new User() { id = 1, LastName = "User1", Other = "A" }); 
     foo.data.Add(new User() { id = 2, LastName = "User2", Other = "B" }); 
     foo.data.Add(new User() { id = 3, LastName = "User3", Other = "C" }); 

     foo.AddExpression(u => u.id); 
     foo.AddExpression(u => u.LastName); 

     var result = foo.CreateNewByExpression(); 
     Console.WriteLine(result.First().LastName); 
    } 
} 

public class User 
{ 
    public int id { get; set; } 

    public string LastName { get; set; } 

    public string Other { get; set; } 

} 

public class Foo<T> 
{ 
    public List<T> data = new List<T>(); 

    public List<Expression<Func<T, object>>> SelectExpressionsList = new List<Expression<Func<T, object>>>(); 

    public IEnumerable<dynamic> CreateNewByExpression() 
    { 
     foreach (var item in data) 
     { 
      IDictionary<string, object> result = new ExpandoObject(); 
      foreach (var exp in SelectExpressionsList) 
      { 
       string name = GetMember(exp.Body).Member.Name; 
       result[name] = exp.Compile()(item); 
      } 

      yield return result as ExpandoObject; 
     } 
    } 

    public void AddExpression(Expression<Func<T, object>> exp) 
    { 
     SelectExpressionsList.Add(exp); 
    } 

    public static MemberExpression GetMember(Expression expression) 
    { 
     MemberExpression exp = null; 
     switch (expression.NodeType) 
     { 
      case ExpressionType.MemberAccess: 
       exp = expression as MemberExpression; 
       break; 
      case ExpressionType.Convert: 
       exp = ((UnaryExpression)expression).Operand as MemberExpression; 
       break; 
      default: 
       break; 
     } 

     return exp; 
    } 
} 
+0

それは私が必要なものです。ありがとうございました。 – Celer

関連する問題