包含不同类实例的数组?

时间:2015-03-14 17:52:37

标签: c# arrays object

我想知道是否有办法访问下面代码中对象中的不同方法?

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...
            }
        }
    }
}

我使用Object类型而不是一个类的数组的原因是因为我想在数组中存储不同类型的对象。在我的测试中途,虽然我注意到我无法访问我已经存储在数组中的对象的方法,因此为什么只有一种类型的对象。

2 个答案:

答案 0 :(得分:4)

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

var obj = _test[i] as TallGuy;
if (obj != null) Console.WriteLine("Height: {0}", obj.Height);

您也可以使用反射。

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

答案 1 :(得分:2)

您只处理数组中的TallGuy个对象,因此您可以使用:

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>,然后让Contravariance/Covariance接管。

List<Guy> people = new List<Guy>();
people.Add(new TallGuy());
people.Add(new ShortGuy());

另一种方法是将对象转换为foreach

中的类型
 var tallGuy = _test[i] as TallGuy;

然后通过检查是否为null来检查演员是否成功:

if (tallGuy != null) {

}

(但你不会有一个强类型的列表,可能会遇到拳击对象然后再回来的性能问题。)