繁体   English   中英

c#:从object []数组中调用对类对象的存储引用的公共方法

[英]c#: Calling common method of stored references to class objects from object[] array

在对象类型上使用开关真的是调用存储引用类对象的常用函数的主要方法吗? 它不必是“对象”值类型。

using System;

public class MainClass { public void Main() { print "hello world"; } }
public class SubClassOne : MainClass { }
public class SubClassTwo : MainClass { }

public class Storer
{
     public void Main() {
         object[] objects = new object[2];
         objects[0] = new SubClassOne();
         objects[1] = new SubClassTwo();
         for(i=0;i<2;i++)
         {
             switch(objects[i].GetType().ToString())
             {
                 case: "SubClassOne":
                     SubClassOne subclass = objects[i];
                     subclass.Main();
                     break;
                 case: "SubClassTwo":
                     SubClassTwo subclass = objects[i];
                     subclass.Main(); //Could probably call after the switch
                     break;
             }
         }
     }
}

注意:代码未解析,因此可能存在严重错误。

在这种情况下,我建议使用as关键字来执行安全的强制转换操作:

using System;

public class MainClass { public void Main() { print "hello world"; } }
public class SubClassOne : MainClass { }
public class SubClassTwo : MainClass { }

public class Storer
{
    public void Main() {
     object[] objects = new object[2];
     objects[0] = new SubClassOne();
     objects[1] = new SubClassTwo();
     for(i=0;i<2;i++)
     {
        var myMainClass = objects[i] as MainClass;
        if (myMainClass != null)
        {
            myMainClass.Main();
        }
     }
 }
}

正如wudzik所说,将对象声明为MainClass数组应该更好

Stringly ”类型的面向对象代码是一个糟糕的主意 你(几乎)永远不需要通过字符串知道对象的类型。

将“print”更改为Console.WriteLine并将main更改为此工作正常

    MainClass[] stuff = new MainClass[2];
    stuff[0] = new SubClassOne();
    stuff[1] = new SubClassTwo();
    foreach(var item in stuff)
    {
        item.Main();
    }

如果问题是你决定使用一个object数组,AlexH已回答。

您应该实现更面向对象的解决方案。 您应该将MainClass抽象化并定义一个抽象方法Main,而不是创建一个由对象组成的数组。 之后,您应该在子类中实现Main。

通过这种方式,您可以将代码交换为:

using System;

public abstract class MainClass { public abstract void Main(); }

public class SubClassOne : MainClass { 
    public override void Main() { print "SubClassOne, hello world"; } 
}
public class SubClassTwo : MainClass { 
    public override void Main() { print "SubClassTwo, hello world"; }
}

public class Storer
{
    public void Main() {
        MainClass[] objects = new MainClass[2];
        objects[0] = new SubClassOne();
        objects[1] = new SubClassTwo();

        foreach(MainClass mc in objects)
        {
            mc.Main();
        }
    }
}  

有很多方法可以很好地解决这个问题,具体取决于:

如果你知道类型并且它们不是太多:

使用LINQ OfType<>() 有关详细信息,请参阅MSDN

foreach (var item in objects.OfType<SubClassOne>())
{
   item.Main();
}

foreach (var item in objects.OfType<SubClassTwo>())
{
   item.Main();
}

如果有很多类型,只需介绍通用接口

interface ISharedApi
{
    void Main();
}

class SubClassOne : ISharedApi
class SubClassTwo : ISharedApi

并通过它实现此/标记每种类型,然后您只需要单循环:

var objects = new List<ISharedApi>();
objects.Add(new SubClassOne());
objects.Add(new SubClassTwo());

foreach (var item in objects)
{
   item.Main();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM