通用的插件

  • 本文关键字:插件 c# reflection
  • 更新时间 :
  • 英文 :


你好,我写了一个插件

就像这样

public class Person
{
public string Name;
public string Surname;
}
public interface IWork
{
Type GetType {get;} 
}
public interface IWorker<T> : IWork
{
 T GetSingle();
 T[] GetMultiple();
 void DoWork(T object);
}

有一个插件是这样的

public PersonPlugin : IWroker<Person>
{
//implementation of interface
//return typeof(Person);
}

现在的问题是,我如何动态创建一个实例,例如IWork ?如果我只有类型,如何转换为IWork,这是可能的?

我想做的(应该是动态的,对于所有的插件实例)

IWork<T> iWorkInstalce = (IWork<T>)Activator.CreateInstance(typeof(PersonPlugin));

IWork iWorkInstalce = (IWork)Activator.CreateInstance(typeof(PersonPlugin));
IWork<Person> personInstance = (CAST) typeof(IWork<>).MakeGenericType(iWorkInstance.Type);

如果不指定T是什么,就不能强制转换为IWorker<T>。如果您这样做了,那么您的第一个示例是有效的:

IWorker<Person> iWorkInstalce = (IWorker<Person>)Activator.CreateInstance(typeof(PersonPlugin));

可以在PersonPlugin类上使用反射来找到它对IWorker<T>的实现,然后发现T是什么,但这只是作为运行时使用,它在代码中根本不会帮助你。

如果你知道你期望的T是什么,明确地指定它。否则,转换为非泛型IWork,并给它返回Object的方法版本。如果你在编译时不知道T是什么,那么一个通用的IWorker<T>在这里并不能真正帮助你。

如果你的应用程序需要知道你的插件在运行时使用的类型,它可以调用GetType属性

相关内容

  • 没有找到相关文章

最新更新