2015-09-26 3 views
0

Я не уверен, что это возможно в C#. Но я хотел бы узнать, как это можно сделать легко.Связать переменную с списком

public partial class Form1 
{ 
    // I left out the unimportant code for this example 
    private myControl cLeft,cTop,cBottom,cRight; 
    private List<myControl>mControls; 
    public Form1() 
    { 
    InitializeComponents(); 
    //this list should contain the fields cLeft,cTop,cBottom,cRight... 
    mControls=new List<myControl>(){cLeft,cTop,cBottom,cRight}; 
    /* now I want that cLeft and so on get assigned... 
    of course, this doesn't work because the list refers to the values of 
    cLeft ... which are null. So I would need to store a reference to those fields to get this work.*/ 
    mControls.ForEach(x=>x=new myControl(this)); 
    } 

} 

Я уверен, что это может быть сделано с помощью отражения, но я предполагаю, что там должен быть способ сделать это легко в C# или не возможно?

+1

Не уверен, что вы ищете. Если вы создаете 4 экземпляра 'myControl' и добавляете их в список, вам все равно нужно создавать их, как вы делаете. Мне кажется довольно легко. Или же 'cLeft' и т. Д. Уже существуют в дизайнере, и вы пытаетесь добавить _those_ в список? –

+0

Это невозможно, даже с отражением. Для этого вам нужно будет сделать несколько обманщиков с «небезопасными». Это также действительно очень плохой идеей сделать это, вы должны переосмыслить то, что вы пытаетесь достичь. Переменные, которые изменяются за вашей спиной через код, который, как представляется, не имеет ничего общего с переменными, - это рецепт для неуправляемой кодовой базы. – Rob

+0

Это похоже на этот вопрос http://stackoverflow.com/questions/7816781/tolist-foreach-in-linq – singsuyash

ответ

0

Это простой цикл, нет необходимости использовать LINQ. Вам просто нужен цикл for.

for (int i = 0 ; i < mControls.Count ; i++) { 
    mControl[i] = new myControl(this); 
} 

Но, нет необходимости писать cLeft, cTop и т.д. Вы можете просто обратиться к ним с помощью индексатор: mControls[0], mControl[1] и т.д.

И помните, петля foreach или ForEach способ расширения не работает. Это связано с тем, что вы меняете ссылку этой переменной. Это просто еще одна запутанная (для новичков) функция ссылочных типов!

Рассмотрим этот метод

public void ChangeReference (string s) { 
    s = "Hello"; 
} 

И вы называете этот метод:

String s = "xxx"; 
ChangeReference (s); 

Будет s быть "Привет" после вызова? Нет. В методе вы меняете местоположение строки в памяти, но аргумент все еще находится в одном месте!

+1

Я думаю, что его главная цель - быстро создать переменные 'cLeft',' cTop' и т. Д. В одном выражении, а не создавать x количество элементов управления. Хотя ваше решение, скорее всего, лучше подходит, оно отвечает на несколько иной вопрос. – Rob

+0

@Rob Я никогда не видел, чтобы кто-то спрашивал о одном заявлении для создания экземпляра множества объектов! И OP вряд ли спросит об этом. Технически цикл 'foreach' представляет собой блок операторов, который считается« заявлением ». – Sweeper

+0

Просто потому, что никто не спросил его раньше, не означает, что этот вопрос не спрашивает :). Из исходного сообщения: 'Теперь я хочу, чтобы cLeft и т. Д. Получили назначенные ...' Я не говорю, что это хорошая идея (на самом деле я оставил комментарий, говорящий обратное на вопросе), - но это похоже на то, что ОП просит. – Rob

Смежные вопросы