c# - 如何将对象转换为其实际类型

标签 c# .net upcasting

考虑以下代码:

class MyClass
{
}

class MyClass2 : MyClass
{
}

private void Foo(MyClass cl)
{
    //cl is actually MyClass2 instance
    TestGeneric(cl);
}

private void TestGeneric<T>(T val)
{
     //do smth
}

调用Foo()后,TestGeneric中的T是MyClass,不是MyClass2。 如何实现将 val 视为 MyClass2 实例? 提前致谢。

更新: 我实际上并不知道该对象是使用 MyClass2 ctor 创建的,而是可以通过调用 val.GetType() 来推断这一点,因为 MyClass2 不会这么简单工作

最佳答案

可以用 visitor pattern 来完成.这是一种很好的面向对象的方法,当您将所有处理代码都放在一个处理程序类中(而不是在每个消息中)并且如果需要更多消息类型时,只需添加额外的处理程序方法即可。

// Your message classes
public class MyClass : IMessage
{
    // Implement acceptance of handler:
    public void AcceptHandler(IMessageHandler handler)
    {
        handler.HandleMessage(this);
    }
}

public class MyClass2 : MyClass
{
     // Nothing more here
}

// Define interface of message
public interface IMessage
{
    void AcceptHandler(IMessageHandler handler)
}

// Define interface of handler
public interface IMessageHandler
{
    // For each type of message, define separate method
    void HandleMessage(MyClass message)
    void HandleMessage(MyClass2 message)
}

// Implemente actual handler implementation
public class MessageHandler : IMessageHandler 
{
    // Main handler method
    public void HandleSomeMessage(MyClass message) // Or it could be IMessage
    {
         // Pass this handler to message. Since message implements AcceptHandler
         // as just passing itself to handler, correct method of handler for MyClass
         // or MyClass2 will be called at runtime.
         message.AcceptHandler(this);
    }

    public void HandleMessage(MyClass message)
    {
         // Implement what do you need to be done for MyClass
    }

    public void HandleMessage(MyClass2 message)
    {
         // Implement what do you need to be done for MyClass2
         // If code of MyClass should be run too, just call 
         // this.HandleMessage((MyClass)message);
    }
}

关于c# - 如何将对象转换为其实际类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13621743/

相关文章:

c# - MVVMCROSS - 将参数传递给 ViewModel

c# - Nancy 示例应用程序中的 Lambda 错误

c# - 从 Linq lambda 返回多个字段

c# - 维护对 Assembly 对象的引用以避免不必要的 Assembly.LoadFrom 调用是好还是坏?

list - 在 F# 中,将类型化列表向上转换为 seq<_> 的最简单方法是什么?

Java 字段继承和向上转型的奇怪行为

c# - 将 XML 中的后代查询到 Linq

c# - 当用户在窗体窗口外单击时如何关闭窗体?

c# - 当 RAM 在 C# 中结束时会发生什么?