Как отлить объект программно во время выполнения? - PullRequest
0 голосов
/ 02 декабря 2009

Предположим, у меня есть пользовательский элемент управления, например:

MyControl : Control

если у меня есть такой код:

List<Control> list = new ...
list.Add (myControl);

RolloutAnimation anim = list[0];

Я знаю, что могу сделать это во время компиляции, но я хочу сделать это во время выполнения и получить доступ к определенной функции MyControl.

Ответы [ 4 ]

9 голосов
/ 02 декабря 2009

Почему вы хотите сделать это во время выполнения? Если у вас есть больше типов элементов управления в вашем списке, которые имеют определенные функциональные возможности, но разные типы, возможно, они должны реализовать общий интерфейс:

interface MyControlInterface
{
    void MyControlMethod();
}

class MyControl : Control, MyControlInterface
{
    // Explicit interface member implementation:
    void MyControlInterface.MyControlMethod()
    {
        // Method implementation.
    }
}

class MyOtherControl : Control, MyControlInterface
{
    // Explicit interface member implementation:
    void MyControlInterface.MyControlMethod()
    {
        // Method implementation.
    }
}


.....

//Two instances of two Control classes, both implementing MyControlInterface
MyControlInterface myControl = new MyControl();
MyControlInterface myOtherControl = new MyOtherControl();

//Declare the list as List<MyControlInterface>
List<MyControlInterface> list = new List<MyControlInterface>();
//Add both controls
list.Add (myControl);
list.Add (myOtherControl);

//You can call the method on both of them without casting
list[0].MyControlMethod();
list[1].MyControlMethod();
4 голосов
/ 02 декабря 2009
((MyControl)list[0]).SomeFunction()
1 голос
/ 02 декабря 2009

(MyControl)list[0] вернет объект типа MyControl или выдаст ошибку, если list [0] не является MyControl.

list[0] as MyControl вернет объект типа MyControl или null, если list [0] не имеет типа MyControl

Вы также можете проверить тип типа списка [0] тестирование list[0] is MyControl

0 голосов
/ 02 декабря 2009
MyControl my_ctrl = list[0] as MyControl;

if(my_ctrl != null)
{
  my_ctrl.SomeFunction();
}

// Or

if(list[0] is MyControl)
{
  ((MyControl)list[0]).SomeFunction();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...