将“类型”传递给通用构造函数

时间:2012-01-03 20:30:54

标签: c# generics reflection

下午,晚上......无论你在哪里;)

我正在开发一个'ThreadManager',它将执行一组'ManagedThread<>'。托管线程是'ManagableThread'的通用包装器,它包含大多数基本方法。

要启动的ManagableThread列表基于配置文件的内容,并在ThreadManager.Start方法中生成。此列表旨在填充所有要管理的ManagedThread。这是我试图用来完成这项任务的代码,因为我确信任何有能力的C#开发人员都会很快意识到 - 我不会像这样摆动它。

public void Start() {
    foreach (String ThreadName in this.Config.Arguments.Keys) {
        Type ThreadType = null;

        if ((ThreadType = Type.GetType(ThreadName)) == null) {
            continue;
        }
        else {
            ManagedThread<ThreadType> T = new ManagedThread<ThreadType>(
                this,
                this.GetConfiguration(ThreadType)
            );
            this.ManagedThreads.Add(T);

            continue;
        }
    }
}

我对此采取了一些措施无济于事。如果有人有任何建议我会感激他们。我不是泛型专家,所以这略微超出了我的专业领域,所以请不要让我哭,但如果我是个傻瓜,请随时抓住我。

提前感谢能够提供帮助的任何人。

编辑:我想我应该澄清我的问题,而不是让大家弄明白......这段代码不能编译,因为我无法将'ThreadType'传递给我的构造函数的泛型参数。

2 个答案:

答案 0 :(得分:7)

这没有意义。
泛型是编译时类型;你不能拥有一个在运行时才知道的编译时类型。

相反,您需要使用Reflection:

Type gt = typeof(ManagedThread<>).MakeGenericType(ThreadType);
object t = Activator.CreateInstance(gt, this,this.GetConfiguration(ThreadType));

答案 1 :(得分:0)

这是不可能的。通用参数必须在编译时知道。直到运行时才知道您的类型。