C#说A不是B的实例,但A实现了接口B

C#说A不是B的实例,但A实现了接口B,c#,plugins,dll,interface,polymorphism,C#,Plugins,Dll,Interface,Polymorphism,问题-我正在尝试插件开发,一切都进展顺利,除了尝试将对象A转换为对象B,即使A实现了B 接口: namespace DynamicApplications { public interface IPlugIn { string Name { get; set; } IPlugInHost myHost { set; } void Show(); } public interface IPlugInHost

问题-我正在尝试插件开发,一切都进展顺利,除了尝试将对象A转换为对象B,即使A实现了B

接口:

namespace DynamicApplications
{
    public interface IPlugIn
    {
        string Name { get; set; }
        IPlugInHost myHost { set; }
        void Show();
    }

    public interface IPlugInHost
    {
        bool Register(IPlugIn plug);
    }
}
实现
IPlugIn的类

namespace plugInOne
{
    class PlugIn : IPlugIn
    {
        IPlugInHost _myHost;

        public string Name
        {
            get
            {
                return "Plug-In One";
            }
            set
            {
            }
        }

        public IPlugInHost myHost
        {
            set
            {
                _myHost = value;
            }
        }

        public void Show()
        {
        }
    }
}
现在是实例化的代码:

        String path = Application.StartupPath;
        string[] assemblyNames = Directory.GetFiles(path, "*.dll");
        plugs = new IPlugIn[assemblyNames.Length];

        for(int i = 0; i < assemblyNames.Length; i++)
        {
            string Name = assemblyNames[i];
            Name = Name.Substring(Name.LastIndexOf("\\") + 1, Name.Length - Name.LastIndexOf("\\") - 1);
            Name = Name.Remove(Name.LastIndexOf(".dll"));
            assemblyNames[i] = Name;
        }

        for (int i = 0; i < assemblyNames.Length; i++)
        {
            Assembly DLL = Assembly.Load(assemblyNames[i]);

            if(DLL != null)
            {
                try
                {
                    Object p = Activator.CreateInstance(DLL.GetType(assemblyNames[i] + ".PlugIn"));

                    if (p is DynamicApplications.IPlugIn)
                    {
                        MessageBox.Show("YES!!!!");
                    }
                    else
                    {
                        MessageBox.Show("no>?>?>>><<?????");
                    }

                    plugs[i] = (IPlugIn)p;
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
String path=Application.StartupPath;
字符串[]assemblyNames=Directory.GetFiles(路径“*.dll”);
plugs=new-IPlugIn[assemblyNames.Length];
对于(int i=0;iMessageBox.Show(“no>?>?>>?>>?>>引用一个
动态应用程序.IPlugIn
,该接口将与程序集中包含的接口不同

您需要从程序集中获取
IPlugin
实例,而不是使用本地实例。如果您执行以下操作,则用于检查的代码可以:

public interface IA { }
public class A :IA { }


object a = Activator.CreateInstance<A>();
if (a is IA)
    Console.WriteLine("Yes");
if (objA.GetType().GetInterfaces().Any(x => x.Name == "IA"))
  Console.WriteLine("Yes");

让你的messagebox显示
p
是什么类型。一旦你知道了这一点,你可能不需要更多的帮助。你似乎引用了不同的程序集。常见错误。我(1)将接口和实例化代码放在控制台应用程序中,(2)从类库引用控制台应用程序,并将实现放在库中,(3)构建库并将DLL放在控制台应用程序的文件夹中,(4)运行控制台应用程序和consel等价的
MessageBox.Show(“YES!!!!”)
确实触发了。原则上你什么也没做;实际上可能你的DLL不在那里,或者已经过时了,或者什么的。好吧,请快速启动-我很困惑。我实例化了一个类型为
plugInOne.PlugIn的对象,它实现了
动态应用程序。IPlugIn
,然后测试实例化的对象是否为
Dyn类型amicApplications.IPlugIn(应该是这样的,因为这是我编码的方式)。抱歉,请解释一些更多和ps。
if(objA.GetType().GetInterfaces().Any(x=>x.Name==“IA”))Console.WriteLine(“是”)
passes您正在从程序集实例化一个
类型
,然后检查您实例化的类型是否实现了接口的本地版本,来自程序集的
类型
将实现接口的程序集版本,而不是本地版本,因为它对它一无所知。@LukeHennerley你认为有一个本地版本的界面吗?(编辑:我想可能是说名字检查通过的注释…@AidenStrydom不是问题,通常最简单的问题是最难解决的。