C#中的类型相等检查

F.P*_*F.P 3 c# types equality

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)

然而,在测试时,这个检查总是失败,即使我肯定在我请求的列表中有这种类型的对象.

在我的理解中,它应该返回MyCompositionPluginCompositionPlugins-List中找到的第一个实例.

我的类型检查错了吗?为什么?它是如何正确完成的?

vcs*_*nes 7

您想IsAssignableFrom在您的类型上使用:

if (ofType.IsAssignableFrom(plugin.GetType())
Run Code Online (Sandbox Code Playgroud)

Equals只处理类型完全相同的情况.IsAssignableFrom还处理ofType可能是插件继承的类型或实现的接口的情况.


Pao*_*lla 5

不是答案,而是评论太久...您确定问题不在于如何调用方法或填充集合吗?比较本身应该可以,如以下简化代码所示:

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)