如何在C#中动态分配对象名称?

时间:2014-03-17 06:05:27

标签: c# generics dynamic

我想在鼠标单击时创建类的对象,然后将某些值保存到我想要检索的值中。

现在我正在使用动态关键字,它适用于点击和插入但之后我想要检索那些保存的对象,它们不止一个,所以如果使用索引它不允许我使用对于动态类型的对象。

我的班级名称是Container,它是一个用户控件。我想在tablelayoutpanel鼠标上的另一个班级中点击

dynamic expando = new Container(); 
int counter = 0;

private void tableLayoutPanel1_MouseClick(object sender, MouseEventArgs e)
{
    var pt = new Point(e.X, e.Y);
    var colWidths = this.MatrixPanel.GetColumnWidths();
    var rowHeights = this.MatrixPanel.GetRowHeights();
    int col = -1, row = -1;
    int offset = 0;

    for (int iCol = 0; iCol < this.MatrixPanel.ColumnCount; ++iCol)
    {
        if (pt.X >= offset && pt.X <= (offset + colWidths[iCol]))
        {
            col = iCol;
            break;
        }
        offset += colWidths[iCol];
    }
    offset = 0;

    for (int iRow = 0; iRow < this.MatrixPanel.RowCount; ++iRow)
    {
        if (pt.Y >= offset && pt.Y <= (offset + rowHeights[iRow]))
        {
            row = iRow;
            break;
        }
        offset += rowHeights[iRow];
    }
    expando.Name = "Count" + counter;
    MatrixPanel.Controls.Add(expando, col, row);

    expando.setposition(row, col);
    expando.SetChannel(click.ToString());

    counter++;
}

现在当我必须检索这些保存的值时,我必须使用expando列表或数组如何声明Container类型和动态类型的列表?

 private void masterTab1_ItemSelected(object sender, object selectedValue)
 {     
    var positions = Adapter.getPositions(RackID);

    for (int i = 0; i < positions.Count; i++)
    {
        MatrixPanel.Controls.Add(expando, positions.ElementAt(i).Y, positions.ElementAt(i).X); // Here I want to use expando[i]

        expando.setposition(positions.ElementAt(i).X, positions.ElementAt(i).Y); // Here I want to use expando[i]
        expando.SetChannel(positions.ElementAt(i).Channel.ToString()); // Here I want to use expando[i]
    }
 }

我的问题与C#, dynamic object names?有点相同,但如果我使用new关键字,那么我将如何调用Container函数,因为我不知道新创建的对象的名称?

有谁知道我怎么能这样做?

enter image description here

1 个答案:

答案 0 :(得分:0)

您正在全局范围内创建一个对象并添加此&#34; expando &#34;到&#34; MatrixPanel &#34;。但是这会将相同的项目添加到&#34; MatrixPanel&#34;。因此,您应该在本地范围内创建对象,并将广告创建到&#34; MatrixPanel &#34;。

我的意思是在* tableLayoutPanel1_MouseClick *事件中创建一个obhect并将其添加到 MatrixPanel 。在那个地方,你用计数器和一些字符串命名。

//Instead of this line
expando.Name = "Count" + counter;

//Add this
dynamic expando1 = new Container(); 
expando1.Name = "Count" + counter;

您可以使用控制数组来获取添加到ParentControl的控件(&#34; MatrixPanel&#34;)。

Object objControl = MatrixPanel.Controls[index];

像这样你必须找出控件。但为此你需要索引。所以一定要知道索引。