C # Не удается преобразовать лямбда-выражение в тип ‘dynamic’, поскольку оно не является типом делегата

#c# #list #dynamic

#c# #Список #динамичный #динамический

Вопрос:

Предположим, у меня есть

 List<dynamic> myList = new List<dynamic>();
  

Внутри класса:

 public class DynamicMixin : DynamicObject
{
    internal List<dynamic> myList= new List<dynamic>();

    public void AddInterface<T>(T _item) where T:class{
        Interfaces.Add(_item);
    }

    public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
    {
        if (myList.Contains((item)=>item.GetType().Equals(indexes[0].GetType())){
            /* do something */
        }
        return base.TryGetIndex(binder, indexes, out result);
    }

}
  

Я пытаюсь писать
myDynamicObject[тип (IDisposable))] myDynamicObject[тип (IDisposable)]
Таким образом, я бы получил IDiposable объект, который принадлежит myDynamicObject.

Эта строка выдает мне ошибку:

 if (myList.Contains((item)=>item.GetType().Equals(indexes[0].GetType())){
  

Не удается преобразовать лямбда-выражение в тип ‘dynamic’, поскольку оно не является типом делегата

Я могу сделать это, просмотрев список: Но почему я не способен использовать Contains ?

Комментарии:

1. Это действительно интересный способ выполнения микширования в c #. У меня есть платформа с открытым исходным кодом, импровизированный интерфейс , который может принимать список интерфейсов и создает действительно легкий прокси, который наследует этот интерфейс и в основном оборачивает кучу привязок callsite, которые пересылаются к DynamicObject. Возможно, это вас заинтересует.

2. Очень интересный ваш фреймворк, jbtule. Я немного покопаюсь в этом.

Ответ №1:

Contains() ожидает, что фактический элемент (типа dynamic в вашем случае) не является делегатом, я думаю, вы хотите Any() :

  if (myList.Any( item => item.GetType().Equals(indexes[0].GetType()))
 {
  

Ответ №2:

Потому что Contains объявляется как:

 public bool Contains(
    T item
)
  

Вы должны использовать Any(your lambda)

Комментарии:

1. О боже, я совсем забыл об этом.

Ответ №3:

IEnumerable<T>.Contains() не имеет перегрузки, которая принимает лямбда-выражение.