【问题标题】:C# Cannot convert lambda expression to type 'dynamic' because it is not a delegate typeC# 无法将 lambda 表达式转换为“动态”类型,因为它不是委托类型
【发布时间】:2011-04-29 18:04:48
【问题描述】:

假设我有一个

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[typeof(IDisposable)] 所以我会得到属于 myDynamicObject 的 IDiposable 对象。

这行给了我一个错误:

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

无法将 lambda 表达式转换为“动态”类型,因为它不是委托类型

我可以通过遍历列表来做到这一点: 但是为什么我不能使用Contains

【问题讨论】:

  • 这是在 c# 中进行混入的一种非常有趣的方式。我有一个开源框架impromptu-interface,它可以获取接口列表并创建一个非常轻量级的代理来继承这些接口,并且基本上包装了一堆转发到 DynamicObject 的调用站点绑定。您可能对此感兴趣。
  • 你的框架非常有趣,jbtule。我会深入研究一下。

标签: c# list dynamic


【解决方案1】:

Contains() 需要一个实际项目(在您的情况下为 dynamic 类型)而不是代表,我认为您想要 Any()

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

【讨论】:

    【解决方案2】:

    因为Conaints 被声明为:

    public bool Contains(
        T item
    )
    

    你应该使用Any(your lambda)

    【讨论】:

    • 天哪,我完全忘记了。
    【解决方案3】:

    IEnumerable&lt;T&gt;.Contains() 没有采用 lambda 的重载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多