Поднять объект - PullRequest
       50

Поднять объект

3 голосов
/ 07 февраля 2012

Я ищу способ получить возможные типы для поднятия объекта.Например: у меня есть элемент управления типа MyControl, который наследует элемент управления.Теперь, когда объект типа MyControl понижен до Control, есть способ узнать, является ли он верхним типом объекта или когда сейчас получить тип (ы), в который он может быть преобразован (в данном случае MyControl)?Я хочу, чтобы это было передано в MyControl (с отражением) и получить свойство с отражением.Но я не знаю MyControl в том месте, где я должен это делать.

MyControl реализует Visible с новым.Теперь, когда я вызываю control.Visible = true, он вызывает Visible of Control, но мне нужно вызвать Visible of MyControl.

Спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 07 февраля 2012

Вы также можете использовать это:

MyControl myControl = someControlOfTypeMyControl as MyControl

if(myControl != null)
{
   //your stuff
}

С "as" .net Framework проверяет, принадлежит ли элемент управления к этому типу и возможно ли приведение .NET Framework будет преобразовывать и возвращать с типомMyControl, в противном случае он вернет значение null.

Так что, в принципе, он такой же, как предыдущие ответы, но более чистый (imho, вы можете думать иначе)

2 голосов
/ 07 февраля 2012

Существует:

if (myControl is MyControl)
{
    var m = (MyControl)myControl;
}

Это будет работать в любой части иерархии типов.Следующая проверка не будет работать, если сама переменная имеет базовый тип:

MyBaseControl myControl = null;

if (myControl.GetType() == typeof(MyControl))
{

}

Однако похоже, что вам нужно поведение переопределенных методов или свойств.В обычной ситуации вы должны переопределить Visible:

public override bool Visible
{
    get { return true; } // Always visible in derived class.
}

Однако это только в том случае, если базовый класс не запечатан и элемент, который вы хотите переопределить, имеет значение abstract или virtual.Если это не так, то я бы придерживался приведения к производному типу ... не идеально, но не так много вариантов.

Звучит так, будто вы пытались скрыть базовый элемент следующим образом:

public new bool Visible
{
    get { return true; }
}

Это работает, только если у вас есть ссылка на сам тип.Если у вас есть ссылка на базовый тип, скрытие элемента работает , а не , оно не знает, что элемент скрыт в производном типе:

MyBaseControl c = new MyDerivedControl();

bool vis = c.Visible; // Comes from MyBaseControl even if hidden in derived control.

(в приведенном выше, если Visible было переопределено, то оно будет получено из производного класса).

Обновление: Чтобы сделать все это во время выполнения, вы можете делать следующее, пока вы знаетеназвания вещей, которые вы хотите отразить:

class Program
    {
        static void Main(string[] args)
        {
            A a = new B();

            // Get the casted object.
            string fullName = a.GetType().FullName;
            object castedObject = Convert.ChangeType(a, Type.GetType(fullName));

            // Use reflection to get the type.
            var pi = castedObject.GetType().GetProperty("Visible");

            Console.WriteLine(a.Visible);
            Console.WriteLine((bool)pi.GetValue(castedObject, null));

            Console.Read();
        }
    }    

    class A
    {
        public bool Visible { get { return false; } }
    }

    class B : A
    {
        public new bool Visible { get { return true; } }
    }
}
0 голосов
/ 07 февраля 2012
Control control = (control)someControlOfTypeMyControl;

if (control is MyControl) {
    var myControl = (MyControl)control;
    var propertyValue = myControl.SomeProperty;
}
...