Передача «Типа» универсальному конструктору - PullRequest
2 голосов
/ 04 января 2012

Днем, вечером ... где бы ты ни был;)

Я работаю над 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 ]

7 голосов
/ 04 января 2012

Это не имеет смысла.
Обобщения являются типами времени компиляции ; у вас не может быть типа времени компиляции, который не известен до времени выполнения.

Вместо этого вам нужно использовать Reflection:

Type gt = typeof(ManagedThread<>).MakeGenericType(ThreadType);
object t = Activator.CreateInstance(gt, this,this.GetConfiguration(ThreadType));
0 голосов
/ 04 января 2012

Это невозможно. Общие параметры должны быть известны во время компиляции. Ваш тип не известен до времени выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...