C# 是否有一种不可知的方法可以将派生类强制转换回其基类而不指定基类?

C# 是否有一种不可知的方法可以将派生类强制转换回其基类而不指定基类?,c#,.net,inheritance,casting,C#,.net,Inheritance,Casting,由于在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); 我对此很好奇,因为我希望能够在不知道基类的情况下完成这项工作,例如在运行时。它们只能从单

由于在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);

我对此很好奇,因为我希望能够在不知道基类的情况下完成这项工作,例如在运行时。

它们只能从单个类派生,但这并不意味着任何基类都不能从另一个基类派生,除非它是
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

它们只能从单个类派生,但这并不意味着任何基类都不能从另一个基类派生,除非它是
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

您可以通过反射获得对象的
BaseType

something.GetType().BaseType
使用该
类型
对象,您可以在运行时动态地强制转换它

不过,我强烈建议不要这样做。它会降低代码的速度,也不会对类型进行编译器检查


如果您需要将其放入
IList
,您已经可以这样做了。

您可以通过反射获得对象的
基类型

something.GetType().BaseType
使用该
类型
对象,您可以在运行时动态地强制转换它

不过,我强烈建议不要这样做。它会降低代码的速度,也不会对类型进行编译器检查


如果您需要将其放入
IList
,您已经可以这样做了。

这取决于您试图解决的问题(例如,阻止所有控件接受用户输入,根据控件实现的不同处理),您的最佳选择可能是为所需的工作单元创建和实现接口


我们在应用程序中广泛使用接口,这样我们就不必担心给定控件如何实现所需的功能。它需要更多的配置,但从长远来看是值得的。

取决于您试图解决的问题(例如,阻止所有控件接受用户输入,根据控件实现的不同处理),您的最佳选择可能是为所需的工作单元创建和实现接口



我们在应用程序中广泛使用接口,这样我们就不必担心给定控件如何实现所需的功能。它需要更多的前期配置,但从长远来看是值得的。

不要这么认为。你总是会在System.Object上结束。你应该看看:哪一个可能会回答你的问题。还有,你的意思是内置在语言中还是你可以写的东西?除非你知道你要强制转换什么,否则强制转换有什么用?@Muzz:内置在语言中,比如
this
base
关键字。不要这样认为。你总是会在System.Object上结束。你应该看看:哪一个可能会回答你的问题。还有,你的意思是内置在语言中还是你可以写的东西?除非你知道你要强制转换什么,否则强制转换有什么用?@Muzz:内置在语言中,比如
this
base
关键字。谢谢,在获得该类型之后,如何在运行时强制转换它?谢谢,在获得该类型后,如何在运行时强制转换它?谢谢,抱歉,我指的是类型的直接基类。您没有提到为什么需要强制转换它。回答“为什么”会得到更多答案,可能是你需要的答案,而不必强制转换类。是的,我没有,因为我想你看到了我对这个问题的最后一条评论:“当你想在运行时做一些动态的事情,比如检查一个值的基类的所有属性并显示它们,这很有用。”基本上需要在运行时检查一个值的基类,所以不需要强制转换它。您需要基类型,一个基类型的列表methodinfo/propertyinfo,并在派生类型上执行它们。Methodinfo/propertyinfo属于基类型,因此当在派生类型上执行时,它们实际上是在基类型上执行的(我非常确定)。谢谢,抱歉,我指的是类型的直接基类。您没有提到为什么需要强制转换它。回答“为什么”会得到更多答案,可能是你需要的答案,而不必强制转换类。是的,我没有,因为我想你看到了我对这个问题的最后一条评论:“当你想在运行时做一些动态的事情,比如检查一个值的基类的所有属性并显示它们,这很有用。”基本上需要在运行时检查一个值的基类,所以不需要强制转换它。您需要基类型,一个基类型的列表methodinfo/propertyinfo,并在派生类型上执行它们。Methodinfo/propertyinfo是基类型,因此在派生类型上执行时,它们实际上在ba上执行