我有一个List< Component>集合(Component是一个自定义类),其中单个元素继承自XTYPE。
但由于某些原因,这不起作用:
X = (XTYPE)Components.Single((c) => c is XTYPE);
我收到一条InvalidOperationException,消息“Sequence contains no matching element”
但是,如果我在该行放置断点并执行此操作,则返回true
:
Components[0] is XTYPE
此外,如果我这样做,则返回true
:
Components[0].GetType().BaseType.BaseType == typeof(XTYPE)
帮助。
确定,所以我在代码中添加了一些检查...
foreach (Component c in Components)
Console.WriteLine(c.GetType().BaseType.BaseType == typeof(Bridge));
if (Components.Count == 0)
throw new Exception("No components");
if (!(Components[0].GetType().BaseType.BaseType == typeof(Bridge)))
throw new Exception("Not bridge.");
False被写入控制台,但类型名称相同。 这可能是DLL地狱。现在需要一组信息来回答这个问题。
我认为你们帮助我走向了解决方案。
进一步说明:有问题的组件是通过来自其中包含XTYPE的DLL的单独实例的反射来实例化的。所以现在我们有两个XTYPE,但它们在技术上并不是同一类型,因为它们有一个diff类型的句柄。
调试器没有检查正确的上下文,所以它认为类型是相同的。但这是错误的。
答案 0 :(得分:1)
Single
抛出。如果您只希望其中一个使用First
。但由于您的更新声明错误是“序列不包含匹配元素”First
对您没有帮助。
您可以考虑使用OfType
。这对您的问题没有帮助,但使代码更好一些。并且防止您在演员阵容中使用与支票中不同的类型。
XTYPE x=Components.OfType<XTYPE>().Single();
其他一些可能的原因:
Components
。因此代码正在处理的集合是空的,您在立即模式中引用的集合包含元素Components
实现,这是不太可能的。答案 1 :(得分:1)
有问题的组件是通过来自其中包含XTYPE的DLL的单独实例的反射来实例化的。所以现在我们有两个XTYPE,但它们在技术上并不是同一类型,因为它们有一个diff类型的句柄。
调试器没有检查正确的上下文,所以它认为类型是相同的。但这是错误的。