C#表示A不是B的实例,但A实现了接口B.

时间:2012-12-11 13:41:38

标签: c# plugins dll interface polymorphism

问题 - 我正在尝试使用plugIn开发,除非尝试将对象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);
                }
            }
        }

请注意,调试器显示p实际上已实例化且可访问

应用程序始终点击MessageBox.Show("no>?>?>>><<?????");

请帮助

艾登

修改

P是类型:

P is of Type:

enter image description here

YET plugInOne.PlugIn实现IPlugIn

1 个答案:

答案 0 :(得分:2)

您引用DynamicApplications.IPlugIn并且该程序集中包含的界面不同。

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

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


object a = Activator.CreateInstance<A>();
if (a is IA)
    Console.WriteLine("Yes");

但是,您从其他地方获取了A(在上述情况下),并且仍在尝试引用您的本地版IA - 因此您需要从程序集中获取接口而不是试图在本地引用它。也许你可以这样做:

if (objA.GetType().GetInterfaces().Any(x => x.Name == "IA"))
  Console.WriteLine("Yes");