Существует ли независимый способ приведения производного класса обратно к его базовому классу без указания базового класса? - PullRequest
0 голосов
/ 02 ноября 2011

Поскольку в C # классы могут быть получены только из одного класса, есть ли способ сделать что-то вроде:

class Control
{}

class Button : Control
{}

class Slider : Control
{}

Button b = new Button();
Slider s = new Slider();

var base = (base) b;
var base2 = CastToBase(s);

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

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

Вы можете получить BaseType объекта с помощью отражения:

something.GetType().BaseType

С этим Type объектом вы можете динамически привести его во время выполнения.

Однако,Я настоятельно советую против этого.Это замедлит ваш код, нет никакой проверки компилятора для типа.

Если вам нужно это, чтобы поместить его в IList<BaseType>, вы уже можете это сделать.

2 голосов
/ 02 ноября 2011

Они могут быть получены только из одного класса, но это не значит, что ни один базовый класс также не был получен из другого базового класса, если он не System.Object.Если бы вы могли определить базовый класс (вы можете использовать отражение) и вы превратили его в базовый класс (вы могли бы использовать отражение), что бы вы получили во время выполнения?

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

using System;
using System.Reflection;

namespace BaseTypetest
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass2 class2 = new BaseClass2();
            Console.WriteLine(class2.Value.ToString());
            Type baseClass = class2.GetType().BaseType;
            Console.WriteLine(baseClass.FullName);
            PropertyInfo info = baseClass.GetProperty("Value");
            if (info != null)
            {
                Console.WriteLine(info.GetValue(class2, null).ToString());
            }
            Console.ReadKey();
        }
    }

    public class BaseClass1 : Object
    {
        public BaseClass1()
        {
            this.Value = 1;
        }

        public int Value { get; set; }
    }

    public class BaseClass2 : BaseClass1
    {
        public BaseClass2()
        {
            this.Value = 2;
        }
        public new int Value { get; set; }
    }
}

Результаты:

2
BaseTypetest.BaseClass1
1
0 голосов
/ 02 ноября 2011

В зависимости от проблемы, которую вы пытаетесь решить (например, не позволяйте всем элементам управления принимать пользовательский ввод, который обрабатывается по-разному в зависимости от реализации элемента управления), лучшим вариантом может быть создание и реализация интерфейсов для требуемой единицы работы.

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

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