你好,我写了一个插件
就像这样
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
属性