C#将类强制转换为接口列表

Phi*_*hil 6 c# casting interface invoke

我正在尝试动态加载一些.dll文件.文件是插件(现在自编),至少有一个实现的类MyInterface.对于每个文件,我正在执行以下操作:

    Dictionary<MyInterface, bool> _myList;

    // ...code

    Assembly assembly = Assembly.LoadFrom(currentFile.FullName);
    foreach (Type type in assembly.GetTypes())
    {
        var myI = type.GetInterface("MyInterface");
        if(myI != null)
        {
            if ((myI.Name == "MyInterface") && !type.IsAbstract)
            {
                var p = Activator.CreateInstance(type);
                _myList.Add((MyInterface)p, true);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

运行此操作会导致强制转换异常,但我找不到解决方法.无论如何,我想知道为什么这根本不起作用.我正在寻找.NET Framework 3.5中的解决方案.

发生在我身上的另一件事是null在上面的代码中p添加新条目之前运行以下内容后进入_myList:

var p = type.InvokeMember(null, BindingFlags.CreateInstance, null,
                          null, null) as MyInterface;
Run Code Online (Sandbox Code Playgroud)

此代码是在加载插件的第一次尝试,我也没找出原因pnull还没有.我希望有人能以正确的方式引导我:)

Ser*_*sev 5

有更简单的方法来检查您的类型是否可以转换为您的界面.

Assembly assembly = Assembly.LoadFrom(currentFile.FullName);
foreach (Type type in assembly.GetTypes())
{
    if(!typeof(MyInterface).IsAssignableFrom(type))
        continue;

    var p = Activator.CreateInstance(type);
    _myList.Add((MyInterface)p, true);
}
Run Code Online (Sandbox Code Playgroud)

如果IsAssignableFrom为false,则继承有问题,这很可能是导致错误的原因.


Ind*_*000 4

您应该真正阅读Jon Skeet 的《插件和抛出异常》,其中解释了您看到的行为以及如何正确使用插件框架。