C# “类型不包含类的定义”错误,但它完全包含

C# “类型不包含类的定义”错误,但它完全包含,c#,C#,我在使用Microsoft.ConfigurationManagement.Messaging.dll的C项目中工作。我调用了一个方法,它列举了我需要了解的关于设备的一系列信息,并将其格式化为Configuration Manager可以使用的格式。我最终得到了一个集合对象,其定义如下: namespace Microsoft.ConfigurationManagement.Messaging.Messages { [XmlInclude(typeof(InventoryInstance

我在使用Microsoft.ConfigurationManagement.Messaging.dll的C项目中工作。我调用了一个方法,它列举了我需要了解的关于设备的一系列信息,并将其格式化为Configuration Manager可以使用的格式。我最终得到了一个集合对象,其定义如下:

namespace Microsoft.ConfigurationManagement.Messaging.Messages
{
    [XmlInclude(typeof(InventoryInstance))]
    [XmlInclude(typeof(ProductInfo))]
    [XmlInclude(typeof(InventoryInstanceGeneric))]
    [XmlInclude(typeof(StateMessage))]
    public class InventoryReportBodyElement
    {
        public InventoryReportBodyElement();
    }
}
这就是我非常困惑的地方。我需要编辑集合中某个项的属性,但当我尝试在中使用Linq方法语法选择正确的实体时,出现以下编译器错误:

InventoryReportBodyElement OSClass = ddrMessage.DdrInstances.Where(m => m.Class == "CCM_DiscoveryData");
类突出显示为:

InventoryReportBodyElement“”不包含“类”的定义 并且没有可访问的扩展方法“Class”接受第一个参数 找不到类型为“InventoryReportBodyElement”的。是否缺少 使用指令还是程序集引用

但是,当我调试时…我完全可以看到所有属性,包括我想用来筛选到正确项的类名。如果我注释掉我的select代码并逐步遍历集合中的每个项目,我可以在“局部变量”窗口中看到我需要的属性

foreach (InventoryReportBodyElement Record in ddrMessage.DdrInstances)
        {
        //InventoryReportBodyElement OSClass = ddrMessage.DdrInstances.Where(m => m.Class == "CCM_DiscoveryData");                    
        Debug.WriteLine(Record.ToString());
        }

我错过了什么?我引用了dll…当代码运行时,项目就在那里。为什么编译器会出错

您在调试器中看到的内容并不重要,因为您在调试器中看到的所有内容只在运行时存在。编译器不知道在运行时会出现什么,除了它是InventoryReportBodyElement的实例或子类的实例。编译器只能看到类定义,它肯定不包含名为class的成员

实例的运行时类型实际上是InventoryInstance,它实际上定义了类属性。在这种情况下,您可能应该使用OfType筛选集合:


首先,InventoryReportBodyElement构造函数没有主体。此外,没有公共字符串类{get;}属性。在foreach循环中,您能检查Record.GetType.FullName的值吗?您的错误是关于InventoryReportBodyElement的,而在调试信息中您可以看到Class是InventoryInstance的属性,请在图中第一行中查看Record的值,也许属性中的第一个类被用作默认转换?我知道这是可行的,但我真的不知道为什么会这样。为什么需要OfType?@FoxDeploy OfType尝试将每个项目强制转换为指定的类型,并且仅提供强制转换成功的项目。然后,编译器知道在何处看到的所有项肯定属于InventoryInstance类型,该类型具有名为Class的属性。
ddrMessage.DdrInstances.OfType<InventoryInstance>().Where(m => m.Class == "CCM_DiscoveryData");