Linq Expressions не находит публичный метод ...: - / - PullRequest
2 голосов
/ 29 августа 2011

Я пишу выражение, которое будет проверять, есть ли свойство (перечисление) объекта или не установлены некоторые флаги.

Тест нижеприведенного кода, если достоверность объекта «содержится» или нет в понедельник, с использованием функции HasFlag в Enum.

На самом деле, метод Call, кажется, не находит соответствующий "HasFlag" ... Что я делаю не так в приведенном ниже коде?

using System;
using System.Linq.Expressions;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Expression exp = null;

            var myValParam = Expression.Parameter(typeof(TestHehe), "val");
            var myValTestValidityParam = Expression.Property(myValParam, "TestValidity");

            Validity myVal = Validity.Monday;

            // Gives 'True'
            Console.WriteLine(myVal.HasFlag(myVal));

            // test it
            var myConst = Expression.Constant(myVal, myVal.GetType());

            // here!!!!!!!!!!!!!!!!!!!!!!!!!!
            exp = Expression.Call(myValTestValidityParam, "HasFlag", null, myConst);
            // No method 'HasFlag' on type 'ConsoleApplication3.Validity' 
            // is compatible with the supplied arguments.

            // just to be
            Console.WriteLine(exp.ToString());
        }
    }

    public class TestHehe
    {
        public Validity TestValidity { get; set; }
    }

    [Flags]
    public enum Validity
    {
        Monday = 0,
        Tuesday = 1,
        Wednesday = 2,
        Thursday = 4,
        Friday = 8,
        Saturday = 16,
        Sunday = 32
    }
}

1 Ответ

3 голосов
/ 29 августа 2011
var myConst = Expression.Constant(myVal, typeof(Enum));
// here!

exp = Expression.Call(myValTestValidityParam, "HasFlag", null, myConst);

Вы ищете это?HasFlag хочет Enum в качестве параметра, поэтому я уменьшил myVal.

...