1
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;

namespace Test_console_application
{
    class Program
    {
        static void Main(string[] args)
        {
            var parentPropertyName = "Measurements";
            var parentPropertyType = typeof (Measurement);
            var propertyName = "Data";

            var parameterExp = Expression.Parameter(typeof(Inverter), "type");
            var propertyExp = Expression.Property(parameterExp, parentPropertyName);

            var method = typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public)
                .Single(x => x.ToString() == "Double Min[TSource](System.Collections.Generic.IEnumerable`1[TSource], System.Func`2[TSource,System.Double])")
                .MakeGenericMethod(parentPropertyType);

            var minParameterExp = Expression.Parameter(parentPropertyType, "type2");
            var minPropertyExp = Expression.Property(minParameterExp, propertyName);
            var minMethodExp = Expression.Call(method, propertyExp, minPropertyExp);            
        }
    }

    public class Inverter
    {
        public IList<Measurement> Measurements { get; set; }
    }

    public class Measurement
    {
        public double Data { get; set; }
    }
}

このコードを実行すると、ArgumentException が発生します。

タイプ 'System.Double' の式は、タイプ 'System.Func 2[Test_console_application.Measurement,System.Double]' of method 'Double Min[Measurement](System.Collections.Generic.IEnumerable1[Test_console_application.Measurement]、System.Func`2[Test_console_application.Measurement,System.Double])' のパラメータには使用できません

私はそれが言っていることを理解していますが、私はminPropertyExpでそれをしていると思っていました.
何を変更する必要があるのか​​ わかりません-手がかりはありますか?

4

1 に答える 1

1

プロパティ式を Func として渡すべきではありません。メソッドを渡す必要があります。

あなたは次のようなことをしました:

Measurements.Min(type2.Data)

それ以外の

Measurements.Min(x => x.Data)

モルテン・ホルムガードのコメントより

var minMethod = Expression.Lambda(minPropertyExp, minParameterExp);
var minMethodExp = Expression.Call(method, propertyExp, minMethod);
于 2012-10-30T13:21:42.587 に答える