Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有不同类的实例的数组?_C#_Arrays_Object - Fatal编程技术网

C# 具有不同类的实例的数组?

C# 具有不同类的实例的数组?,c#,arrays,object,C#,Arrays,Object,我想知道是否有一种方法可以访问下面代码中的对象中的不同方法 using System; using System.Windows.Forms; namespace WindowsFormsApplication8 { public partial class Form1 : Form { public Form1() { InitializeComponent(); _test[0] = new T

我想知道是否有一种方法可以访问下面代码中的对象中的不同方法

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            _test[0] = new TallGuy() {Height = 74, Name = "Teddy Long"};
            _test[1] = new TallGuy() {Height = 64, Name = "Teddy Shorter"};
            _test[2] = new TallGuy() {Height = 54, Name = "Teddy Shortest"};
        }

        private readonly object[] _test = new object[3];

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < _test.Length; i++)
            {
                //_test[i].        I can't call any methods here...
            }
        }
    }
}
使用系统;
使用System.Windows.Forms;
命名空间Windows窗体应用程序8
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
_test[0]=new TallGuy(){Height=74,Name=“Teddy Long”};
_test[1]=new TallGuy(){Height=64,Name=“Teddy Shorter”};
_test[2]=new TallGuy(){Height=54,Name=“Teddy Shortest”};
}
私有只读对象[]_test=新对象[3];
私有无效按钮1\u单击(对象发送者,事件参数e)
{
对于(int i=0;i<\u test.Length;i++)
{
//_测试[i]。我无法在此处调用任何方法。。。
}
}
}
}

我之所以使用对象类型而不是一个类的数组,是因为我想在一个数组中存储不同类型的对象。在测试的中途,我注意到我无法访问已存储在数组中的对象的方法,因此其中只有一种类型的对象。

您可以通过检查类型并强制转换来访问这些方法:

var obj = _test[i] as TallGuy;
if (obj != null) Console.WriteLine("Height: {0}", obj.Height);
也可以使用反射


但是,对象的类型是否相关?也许你应该考虑创建一个超级类的公共接口并定义该类型的对象数组。

你只处理数组中的<代码> Talgy对象,这样你就可以使用:

TallGuy[] _test = new TallGuy[3];
这将提供对
TallGuy
属性的访问

如果您还处理其他对象类型,例如
SmallGuy
,那么最好使用对象层次结构,然后使用强类型列表,而不是使用
object

例如:

public abstract class Guy 
{
     abstract public int Height { get; set; }
}

public class TallGuy : Guy 
{
    public override int Height 
    {
        get { return 100; }
        set { } 
    }
}

public class ShortGuy : Guy 
{
    public override int Height 
    {
        get { return 10; }
        set { }
    } 
}
有了这个结构,您可以有一个
列表
,然后让
逆变换/协方差
接管

List<Guy> people = new List<Guy>();
people.Add(new TallGuy());
people.Add(new ShortGuy());
然后通过检查是否为null来检查强制转换是否成功:

if (tallGuy != null) {

}

(但您不会有强类型列表,并且可能会遇到性能问题,比如装箱对象,然后再回退)。

事实上,我本来打算添加不同的类型,但偶然发现了这个问题。决定在我继续之前先尝试解决它。您需要将对象强制转换为appropiate类型以访问其MethodsHanks以获取答案。这是我决定看的头一本C#书中的一个“脑力”问题。问题如下“如果您有一些其他类不是从Worker继承的,而是实现了INectarCollector接口,那么它也可以完成这项工作!但因为它不是从工蜂那里继承的,所以你不能把它和其他蜜蜂放在一个数组中。你能想出一种方法来绕过这个问题,用蜜蜂和这个新类创建一个数组吗?“这似乎是我的拿手好戏,这本书:P。这叫做多态性
if (tallGuy != null) {

}