C# 通用插件
嗨,我写了一些插件 看起来是这样的C# 通用插件,c#,reflection,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 P
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
{
类型GetType{get;}
}
公共接口IWorker:IWork
{
T GetSingle();
T[]GetMultiple();
空道工(T对象);
}
一个插件就是这样的
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);
}
publicpersonplugin:IWroker
{
//接口的实现
//返回类型(人);
}
现在的问题是,我如何动态创建一个IWork实例?
如果我只有一个字,那有可能吗
我想做(对于所有插件实例,应该是动态的)
IWork iWorkInstalce=(IWork)Activator.CreateInstance(typeof(PersonPlugin));
或
IWork iWorkInstalce=(IWork)Activator.CreateInstance(typeof(PersonPlugin));
iWorkPersonInstance=(CAST)typeof(IWork).MakeGenericType(iWorkInstance.Type);
如果不指定t
是什么,则无法强制转换到IWorker
。如果您这样做,您的第一个示例是有效的:
IWorker<Person> iWorkInstalce = (IWorker<Person>)Activator.CreateInstance(typeof(PersonPlugin));
IWorker iWorkInstalce=(IWorker)Activator.CreateInstance(typeof(PersonPlugin));
可以在PersonPlugin
类上使用反射来查找它的IWorker
实现,然后发现T
是什么,但这只是作为运行时使用,在代码方面对您毫无帮助
如果您知道您期望的T
是什么,请明确指定它。否则,将其转换为非泛型的IWork
,并为其提供返回对象的方法版本。如果您在编译时不知道t
是什么,那么拥有一个通用的IWorker
在这里并不能真正帮助您
如果您的应用程序需要知道插件在运行时使用的是什么类型,它可以调用GetType
属性。为什么要执行该转换?你想对结果做什么?你能用C#4的动态?