我知道只有workaround才有可能。但是为什么呢?
我想为我的应用添加插件支持。因此,我设计了一个抽象类,所有将来的插件都需要实现。每个插件都必须实现一个GetVersion()
方法,例如以下示例代码:
public abstract class Plugin
{
public abstract int GetVersion();
}
public class MyPlugin : Plugin
{
public override int GetVersion()
{
return 1;
}
}
只要我在调用GetVersion()
方法之前实例化插件,这当然就可以完美地工作。
但是如果我想在创建插件实例之前获取插件的版本号 ?例如要检查兼容性?
public class Program
{
public Program()
{
if (MyPlugin.GetVersion() > 1)
{
PluginLoader.Load(new MyPlugin());
}
}
}
答案 0 :(得分:1)
尽管它可能无法直接回答您的问题“为什么”,但我认为以下解决方案可能对您的情况有用:
Assembly thisAssem = typeof(MyPlugin).Assembly;
AssemblyName thisAssemName = thisAssem.GetName();
Version ver = thisAssemName.Version;
答案 1 :(得分:0)
由于无法在派生类中实现静态方法,因此C#永远无法完成。
类似于解决方法,您可以创建一个静态工厂来创建实例。
public abstract class Plugin
{
public abstract int GetVersion();
}
public class FactoryPlugin<T> where T : Plugin, new()
{
public static int GetVersion()
{
return new T().GetVersion();
}
}
public class Program
{
public Program()
{
if (FactoryPlugin<MyPlugin>.GetVersion() > 1)
{
}
}
}
答案 2 :(得分:0)
考虑以类似于COM类工厂的方式使用Factory模式。您创建两个类,您的有用的类和一个类工厂类。您的类工厂类实现IPluginFactory。您将其与插件打包在一起。插件工厂有多种简单方法,但是其中一种方法可以创建您的插件。它与@ThierryV显示的内容很接近,但是没有静态方法。这样的过程是:
这是一个不错的起点:What exactly is a Class Factory?,但是很久以前,在Don Box的Essential COM书籍中,我学到了所有这些东西。