Использование LINQ с динамическими переменными в C#

Это правильный способ использования динамических переменных в С#?

Я получаю следующую ошибку, когда пытаюсь использовать выражения LINQ с динамической переменной.

Ошибка. Невозможно использовать лямбда-выражение в качестве аргумента для динамически отправляемой операции без предварительного приведения его к типу дерева делегата или выражения

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic dAnimal = new Animal();
            string cc = dAnimal.x;
            Animal oAnimal = new Animal();
            var test1 = oAnimal.listFood.Where(a => a.foodName == "");
            var test2 = dAnimal.listFood.Where(a => a.foodName == "");//Error
        }
    }

    public class Animal
    {
        public string animalName {get; set;};
        public List<Food> listFood;
    }

    public class Food
    {
        public string foodName;
    }
}

person Kalyan Chakravarthy S    schedule 31.10.2014    source источник
comment
вы можете просто привести dAnimal.listFood к IEnumerable‹Food›   -  person Manuel Schweigert    schedule 31.10.2014


Ответы (1)


Я понимаю проблему так, что тип dAnimal.listFood неизвестен во время компиляции, потому что dAnimal является динамическим. Таким образом, компилятор не может гарантировать, что listFood является IEnumerable и его элемент имеет свойство foodName. Однако, если вы будете использовать делегат, каждый элемент listFood будет неявно приведен к типу входного параметра делегата (у вас все еще будет проблема с типом коллекции).

В любом случае, нет необходимости использовать dynamic в этом контексте.

person Andrew Kovalenko    schedule 31.10.2014