C# 如何找到基类的任何子类,然后从中获取变量

C# 如何找到基类的任何子类,然后从中获取变量,c#,inheritance,C#,Inheritance,我有一个由各种预制件组成的列表 此列表中的每个预置都有一个脚本,该脚本附加了各种子类,这些子类包含一个整数“dicesides”(表示一个6/8/10面的骰子)。它们派生自一个公共基类“dice_BaseClass” 我想创建一个方法,查看列表中的每个预置,在预置中找到子类(这是困难的一点),获取dicesides变量并使用roll dice方法 下面是一些我的不可靠代码的简化示例 骰子父类 public class dice_BaseClass : MonoBehaviour { priva

我有一个由各种预制件组成的列表

此列表中的每个预置都有一个脚本,该脚本附加了各种子类,这些子类包含一个整数“dicesides”(表示一个6/8/10面的骰子)。它们派生自一个公共基类“dice_BaseClass”

我想创建一个方法,查看列表中的每个预置,在预置中找到子类(这是困难的一点),获取dicesides变量并使用roll dice方法

下面是一些我的不可靠代码的简化示例

骰子父类

public class dice_BaseClass : MonoBehaviour {

private int dicesides = 8;

    public int DiceSides {
        get 
        { 
            return dicesides;
        }
        set
        {
            dicesides = value;
        }
    }
}
骰子子子类“蓝色”-简单地设置骰子边

public class dice_ChildClass_Red : dice_BaseClass
{
    public void Start () {
        DiceSides = 12;
    }
}
public class dice_ChildClass_Blue : dice_BaseClass
{
    public void Start () {
        DiceSides = 8;
    }
}
骰子子子类“红色”-简单地设置骰子边

public class dice_ChildClass_Red : dice_BaseClass
{
    public void Start () {
        DiceSides = 12;
    }
}
public class dice_ChildClass_Blue : dice_BaseClass
{
    public void Start () {
        DiceSides = 8;
    }
}
然后在另一个类中,它包含一个预置列表,其中包含附加到它们的子脚本

public void RollDice () {

    foreach (GameObject go in goList){

        var diceClass = teffect.GetComponent<dice_BaseClass>();
        print (diceClass.DiceSides);
}
public void RollDice(){
foreach(游戏对象进入高尔夫){
var diceClass=teffect.GetComponent();
打印(diceClass.DiceSides);
}
但是,这不起作用。它只获取基类的默认值

我也试着研究泛型,认为这可能与它有关。下面的内容都是胡说八道,但也许看看我的思维过程到哪里去了并失败了会很有用

public void GenericTest<T>() where T : dice_BaseClass {

    foreach (GameObject go in goList){

        var testClass1 = teffect.GetComponent(typeof(T));

        var testClass2 = effectClass.GetType();

        var testClass3 = teffect.GetComponent("effectClass2");

        //effectClass = teffect.GetComponent(GetType().Name);

        print ("Hi " + effectClass2 );

    }
}
public void GenericTest(),其中T:dice\u基类{
foreach(游戏对象进入高尔夫){
var testClass1=teffect.GetComponent(typeof(T));
var testClass2=effectClass.GetType();
var testClass3=teffect.GetComponent(“effectClass2”);
//effectClass=tefect.GetComponent(GetType().Name);
打印(“Hi”+2级);
}
}
非常感谢您通读并提供任何提示/解决方案。

您可以将DiceSides属性标记为虚拟,并在
子类中重写它,如下所示:

public class Base
{
    public virtual int sides { get { return 8; } }
}

public class Child : Base
{
    public override int sides { get { return 10; } }
}
测试:

结果:

10
8

我看不到您在哪里调用
Start
,因此在子类中永远不会设置
dicedes
属性。您应该在构造函数中设置该属性:

public class dice_ChildClass_Red : dice_BaseClass
{
    public dice_ChildClass_Red() {
        DiceSides = 12;
    }
}

public class dice_ChildClass_Blue : dice_BaseClass
{
    public dice_ChildClass_Blue() {
        DiceSides = 8;
    }
}

我认为
monobhavior
中的每一个细节都是Unity的基类和特殊性:@FSou1所以
Start
是由
GetComponent
调用的?对不起,我从来没有使用过Unity。我不太确定,但我希望topic starter确保在
print
之前调用
Start
,谢谢您的回复,它确实有效但这并不是我想要的结果,因为它依赖于每次我编写一个新的子类时都必须重写它,任何方法都需要重写和几乎从头开始编写。我认为我需要的是一种能够真正抓住子类并在其上调用方法的东西。我希望这有一定的意义