Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建/实例化';类型';_C#_.net_Reflection - Fatal编程技术网

C# 如何创建/实例化';类型';

C# 如何创建/实例化';类型';,c#,.net,reflection,C#,.net,Reflection,我想遍历程序集中的类型,如果类型是指定接口的子类,我想创建该类型的对象并将其添加到如下列表中: var tasks = new List<IScheduledTask>(); foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) { if (t.IsSubclassOf(typeof(IScheduledTask))) { tasks.Add(new t()); } }

我想遍历程序集中的类型,如果类型是指定接口的子类,我想创建该类型的对象并将其添加到如下列表中:

var tasks = new List<IScheduledTask>();

foreach (Type t in Assembly.GetExecutingAssembly().GetTypes())
{
    if (t.IsSubclassOf(typeof(IScheduledTask)))
    {
        tasks.Add(new t());
    }
}
var tasks=newlist();
foreach(在Assembly.getExecutionGassembly().GetTypes()中键入t)
{
if(t.IsSubclassOf(typeof(IScheduledTask)))
{
添加(新的t());
}
}

显然,上述方法不起作用。你如何才能实现我所追求的目标?

激活器。CreateInstance是你所追求的

var tasks = new List<IScheduledTask>();
foreach (Type t in Assembly.GetExecutingAssembly().GetTypes())
{
    if (t.IsSubclassOf(typeof(IScheduledTask)))
    {
        tasks.Add((IScheduledTask)Activator.CreateInstance(t));
    }
} 
var tasks=newlist();
foreach(在Assembly.getExecutionGassembly().GetTypes()中键入t)
{
if(t.IsSubclassOf(typeof(IScheduledTask)))
{
添加((isScheduledTask)Activator.CreateInstance(t));
}
} 

前面的问题可能会有所帮助

它使用
Activator.CreateInstance
查看使用方法:

我会成功的


但是要小心,要实例化的类必须有一个没有参数的公共构造函数才能工作。

这将创建一个
Object
类型的对象列表,不是吗?不,该对象将是T类型的,您只需要强制转换它。@abe miessler强制转换它:
tasks.Add((isscheduledtask)Activator.CreateInstance(T))啊,我想他想创建一个从接口继承的类的实例。如果他想这么做,可能吗?@Abe Miessler,这就是
CreateInstance
正在做的事情。指定给它的类型是实现类型,而不是接口类型本身。您可以强制转换为
IScheduledTask
,因为您必须这样才能将其列入列表。
ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);
Activator.CreateInstance(t);