(動的LINQ式を作成するには)。 Data
とIntArrayEqualityComparer
がリフレクションにLINQの式を変換する方法を、私は三つのクラスを作成しました
public class Data
{
public Dictionary<int[], List<double>> s = new Dictionary<int[], List<double>>(new IntArrayEqualityComparer());
public Data()
{
}
public Data(Dictionary<int[], List<double>> s)
{
this.s = s;
}
public Dictionary<int[], List<double>> S
{
get { return s; }
set { s = value; }
}
}
public class IntArrayEqualityComparer : IEqualityComparer<int[]>
{
public bool Equals(int[] x, int[] y)
{
if (x.Length != y.Length)
{
return false;
}
for (int i = 0; i < x.Length; i++)
{
if (x[i] != y[i])
{
return false;
}
}
return true;
}
public int GetHashCode(int[] obj)
{
int result = 17;
for (int i = 0; i < obj.Length; i++)
{
unchecked
{
result = result * 23 + obj[i];
}
}
return result;
}
}
below-私は反射にLINQ式を変換する必要のあるExpression
が作成された名前の第三のクラスです 2つのクラス -
public class Expresion
{
public void CreateExpression()
{
Expression<Func<Data, List<int>>> exp1 = null;
//Below is the LINQ expression I want to convert
exp1 = p2 => p2.s[new int[] { 14, 5 }].Select((item, index) => new { item, index }).Select(x => x.index).ToList();
ParameterExpression p1 = Expression.Parameter(typeof(Data), "p");
MethodInfo mInfo = typeof(List<double>).GetMethod("get_Item");
MethodInfo mInfo1 = typeof(Dictionary<int, List<double>>).GetMethod("get_Item");
MethodInfo mInfo2 = typeof(Dictionary<int[], List<double>>).GetMethod("get_Item");
MethodInfo mInfo3 = typeof(List<int[]>).GetMethod("get_Item");
MemberExpression s1 = Expression.Property(p1, "s");
ParameterExpression index1 = Expression.Parameter(typeof(int), "index");
ParameterExpression item1 = Expression.Parameter(typeof(double), "item");
//Here I want to covert the "(item, index) => new { item, index }" part from LINQ expression into Reflection
}
}
私は '「get_Item」' 'MethodInfo'オブジェクトとして、あなたはおそらく' GetIndexParameters'はカウントを持っているものを見つけることによって、インデクサー 'PropertyInfo'を見つける必要がありますに依存しないでしょう。それだけでも私です。適切なオーバーロードでEnumerable.Selectからジェネリックメソッド呼び出しを作成する必要がある場合は、ラムダ式(あなたのanon型のニュース)を作成し、それを渡します。問題は例をここで見ることができ、あなたの匿名型を構築されます。http://stackoverflow.com/a/3740637/491907 – pinkfloydx33
余談、プロヒント:書き込み '式> EXP = P2 => ..それ以降にブレークポイントを設定します。次に、デバッガを使用して 'exp'の' DebugView' "プロパティ"を検査し、それがどのように構築されているかを確認します。この場合は動作しないかもしれませんが、間違いなく役立つことがあります。また、読めるように少し簡単にインストールできる他のExpression Visualizesもあります。 –
pinkfloydx33
あなたは物事を複雑にするかもしれません。実行しているすべてがインデックスを選択している場合は、実際には匿名型は必要ありません。 2番目に連鎖した 'Select'を削除して、最初のインデックスでintとしてインデックスを返します。 – pinkfloydx33