同
public abstract class CompositionPlugin { ... }
Run Code Online (Sandbox Code Playgroud)
和
public class MyCompositionPlugin : CompositionPlugin { ... }
Run Code Online (Sandbox Code Playgroud)
我想检查一个对象的类型是否等于给定的类型:
public class Framework {
    public IList<CompositionPlugin> CompositionPlugins = new List<CompositionPlugin>();
    public CompositionPlugin GetCompositionPlugin(Type ofType)
    {
        foreach (CompositionPlugin plugin in CompositionPlugins)
        {
            if (plugin.GetType().Equals(ofType))
                return plugin;
        }
        throw new ArgumentException("A composition plugin of type " + ofType.FullName + " could not be found");
    }
}
Run Code Online (Sandbox Code Playgroud)
方法的调用方式如下:
Framework framework = new Framework();
// Adding the plugin to the framework is done by loading an assembly and
// checking if it contains plugin-compatible classes (i.e. subclasses
// of <CompositionPlugin>)
framework.RegisterAssembly("E:\\Projects\\Framework\\MyPlugin\\bin\\Debug\\MyPlugin.dll");
CompositionPlugin plugin = framework.GetCompositionPlugin(typeof(MyCompositionPlugin));
Run Code Online (Sandbox Code Playgroud)
然而,在测试时,这个检查总是失败,即使我肯定在我请求的列表中有这种类型的对象.
在我的理解中,它应该返回MyCompositionPlugin在CompositionPlugins-List中找到的第一个实例.
我的类型检查错了吗?为什么?它是如何正确完成的?
您想IsAssignableFrom在您的类型上使用:
if (ofType.IsAssignableFrom(plugin.GetType())
Run Code Online (Sandbox Code Playgroud)
Equals只处理类型完全相同的情况.IsAssignableFrom还处理ofType可能是插件继承的类型或实现的接口的情况.
不是答案,而是评论太久...您确定问题不在于如何调用方法或填充集合吗?比较本身应该可以,如以下简化代码所示:
class A {}
bool TestType(A item, Type ofType)
{       
    return item.GetType().Equals(ofType);
}
Run Code Online (Sandbox Code Playgroud)
现在:
Console.WriteLine(TestType(new A(), typeof(A))); // True
Console.WriteLine(TestType(new A(), typeof(string))); // False
Run Code Online (Sandbox Code Playgroud)
编辑
我认为@vcsjones是正确的。您正在尝试将派生类与基类进行比较。在这一行中,foreach (CompositionPlugin plugin in CompositionPlugins)您声明插件为CompositionPlugin,但在客户端代码中,您将其与进行比较typeof(MyCompositionPlugin)。(重新编辑,不,我错了,您的情况对应于Console.WriteLine返回true 的我的第4个)
在与您相似的场景中,请参阅带有示例的真值表的此示例:
class CompositionPlugin {}
class MyCompositionPlugin : CompositionPlugin  {}
// Define other methods and classes here
bool TestType(CompositionPlugin item, Type ofType)
{       
    return item.GetType().Equals(ofType);
}
Run Code Online (Sandbox Code Playgroud)
现在
Console.WriteLine(TestType(new CompositionPlugin(), 
            typeof(CompositionPlugin))); //True
Console.WriteLine(TestType(new CompositionPlugin(), 
            typeof(MyCompositionPlugin))); //False
Console.WriteLine(TestType(new MyCompositionPlugin(), 
            typeof(CompositionPlugin))); //False
Console.WriteLine(TestType(new MyCompositionPlugin(),
            typeof(MyCompositionPlugin))); //True
Run Code Online (Sandbox Code Playgroud)