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的
动态