C#说A不是B的实例,但A实现了接口B
问题-我正在尝试插件开发,一切都进展顺利,除了尝试将对象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
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;i MessageBox.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不是问题,通常最简单的问题是最难解决的。