C#如何动态转换对象

C# how to dynamically cast object

public class TriggerableObject 
{
    Trigger(){
        DoSomething();
    }
}
public class X : TriggerableObject
{
    Trigger(){
        DoSomethingElse();
    }
}
public class X2 : TriggerableObject
{
    Trigger(){
        DoSomethingOther();
    }
}
public class Trigger
{
    TriggerableObject obj = FindMyObject();
    obj.Trigger();
}

Class Trigger 从其他对象中找到 class X,但是当它调用 Trigger() 时,会调用基 class 中的方法 (DoSomething())。但是,我希望它从 class X (DoSomethingElse()) 调用触发器,如果​​我将它转换为 class X,它会起作用。问题是我不知道是否找到了 class 将是 X 或 X2,因此如果我将其静态转换为 X,则它不适用于 X2。
我该怎么做?

您需要在基础 class 中覆盖该行为。您需要首先将基 class 中的方法标记为虚拟方法,然后在继承自基 class.

的所有 class 中重写该函数
public class TriggerableObject 
{
    public virtual Trigger(){
        DoSomething();
    }
}
public class X : TriggerableObject
{
    public override Trigger(){
        DoSomethingElse();
    }
}
public class X2 : TriggerableObject
{
    public override Trigger(){
        DoSomethingOther();
    }
}
public class Trigger
{
    TriggerableObject obj = FindMyObject();
    obj.Trigger();
}

请注意,如果您不想在基类中实现 class,您可以使用抽象方法

接口是你的朋友。如果您的代码中有一个特定的结构(正如您所拥有的)但实现不同,那么请考虑 interfaces。当然这并不总是答案,但您的上述示例可以按以下方式编写。

public interface ITriggerableObject 
{
    Trigger();
}
public class X : ITriggerableObject 
{
    Trigger(){
        DoSomethingElse();
    }
}
public class X2 : ITriggerableObject 
{
    Trigger(){
        DoSomethingOther();
    }
}
public class Trigger
{
    ITriggerableObject obj = FindMyObject();
    obj.Trigger();
}

语法可能不对,因为我没有编译它,但语义是可靠的。

.NET Interfaces