2012-07-25 51 views
0

假设我有一个过载的方法,例如void PrintInfo(Person)void PrintInfo(Item)等等。我尝试通过传入一个对象来调用这些方法。将对象转换为适合重载方法的适当类型

我想知道为什么当我这样做的时候给了我一个错误;不是所有的类都从Object继承吗?我想避免做一个if/switch语句,在调用适当的方法之前检查Object的类型。

你们认为在这种情况下最好的办法是什么?

+2

您正在寻找'动态'或访客模式。 – SLaks 2012-07-25 16:06:21

回答

2

全部Person s是object s,但不是全部object s是Person s。因此,您可以将Person传递给接受object的方法,但不能将object传递给需要Person的方法。

听起来好像您在要使用的各种对象之间有一些常见的功能。鉴于此,最好找到一个具有所有你需要的功能的共同祖先,或者他们都实现的接口(它再次提供你需要的一切)。

在打印的情况下,您可能只需要ToString方法。在这种情况下,您可以让该方法接受object并在其上调用ToString。 (这就是许多印刷方法做,如Console.WriteLine

1

你要明白,因为C#是(除非dynamic)所选择的特定超载静态类型语言(称为重载决议)在编译时确定,不运行时间这意味着,编译器需要能够明确地确定什么样的说法是考虑:。

Object foo; 
foo = "String"; 
foo = 5; 
PrintInfo(foo); // Which overload of printinfo should be called? The compiler doesn't know! 

有解决dynamic类型的这 - 使foo几个方法是单是会导致在编译时选择正确的超载那就是你失去了类型安全 - 如果你没有适当的重载类型,你的应用程序仍然会编译,但是当你试图打印不支持的类型的信息时会崩溃。

可以说更好的方法是确保foo总是正确的类型,而不仅仅是Object

正如@Servy所建议的,另一种方法是将行为附加到类型本身。你可以,例如,将一个接口IHasPrintInfo

public interface IHasPrintInfo { String PrintInfo { get; } } 

和实施其信息您可以打印所有物品界面。那么你的PrintInfo函数只需要一个IPrintInfo:

public void PrintInfo(IPrintInfo info) { 
    Console.WriteLine(info.PrintInfo); 
} 
0

这里它的模糊编译器;编译器无法确定您打算调用哪个版本的方法(人员/项目)。

相关问题