2011-11-02 61 views
0

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

我很好奇,因为我希望能够做到这一点不知道他们的基地类,例如在运行时。

+2

不要相信。你总是最终在System.Object。 – Plymouth223

+0

你应该看到:http://stackoverflow.com/questions/1524562/to-get-parent-class-using-reflection-on-c-sharp这可能会回答你的问题。 – Andre

+0

另外,你的意思是内置于语言或你可以写的东西吗? – Plymouth223

回答

2

它们只能从一个类派生,但这并不意味着任何基类都不是从另一个基类派生的,除非它是System.Object。如果你可以确定Base类(你可以使用反射)并且将它作为基类(你可以使用反射),那么你在运行时会获得什么?

如果您试图访问一个基类的方法/属性在派生类中没有提供,有可能是一个很好的原因,它不是在派生类型可用。如果你决定这样做,我不认为你需要投射它,你可以简单地获得基本类型,找到基本类型的方法/属性并在派生类型上调用它们。

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

谢谢,对不起,我的意思是直接基类的类型,运行时做一些动态的东西,这是非常有用的。 –

+0

你还没有提到你为什么需要施放它。回答WHY会给你更多的答案,并且可能是你需要的答案而不需要上课。 –

+0

是的,我并没有这么想,因为我以为你看到了我对这个问题的最后一个补充评论:“当你想在运行时做一些动态的东西时很有用,比如检查一个值的基类的所有属性并显示它们等等。“基本上需要在运行时检查一个值的基类 –

2

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

something.GetType().BaseType 

随着该Type对象,可以在运行时动态投放。

不过,我强烈反对这一点。它会减慢你的代码,也没有编译器检查类型。

如果您需要此把它放在一个IList<BaseType>,你已经可以做到这一点。

+1

谢谢,得到那个类型后,你如何在运行时抛出它? –

0

根据您正试图解决(例如,防止接受用户输入,这是依赖于通过控制执行不同的方式处理所有的控制)的问题,最好的办法可能是创建和实施所需的接口工作单位。

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

相关问题