考虑以下代码:
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/