如何在c#中将接口转换为类型?

Hca*_*tek 3 .net c# polymorphism casting interface

我有一个返回接口的属性.在调试期间,我可以打破返回的内容,当它是界面时,Visual Studio足够聪明,可以知道它实际上是派生类型.我假设它使用反射或其他东西.我不确定.我的问题是,我可以在运行时向我提供相同的信息,这样我就可以创建一个适当类型的变量并将接口转换为那样的接口吗?这就是我的意思:

IPreDisplay preDisplay = cb.PreDisplay;
Run Code Online (Sandbox Code Playgroud)

如果preDisplay是RedPreDisplay,我希望能够编码

RedPreDisplay tmp = preDisplay as RedPreDisplay;
Run Code Online (Sandbox Code Playgroud)

或者如果preDisplay是GreenPreDisplay ......

GreenPreDisplay tmp = preDisplay as GreenPreDisplay;
Run Code Online (Sandbox Code Playgroud)

等...如果可能的话,我想避免使用凌乱的switch语句,如果我可以使用非常棒的泛型.

如果您对我如何做到这一点有任何建议或示例,请分享.

Rex*_*x M 17

当你遇到需要这样做的情况时,这意味着你做错了什么.您需要备份并找出您的设计要求您执行此操作的原因.如果您发现自己被困在那里,我强烈建议您发布一个新问题以获得设计方面的帮助 - 这里有很多聪明人可以提供帮助.

要直接回答你的问题,不 - 如果没有某种if/else或条件,你不能这样做,因为你必须明确静态类型.您可以使用反射来调用该方法,但由于您似乎需要调用接口不支持的东西 - 但是某些对象会这样做 - 您无论如何都需要编写每个静态类型的条件来调用该方法.只需直接编码类型.

编辑:根据评论中的讨论,最好的解决方案是向具有此其他属性或方法的类添加第二个接口.然后你可以做一个简单的检查:

IPreDisplay display = cb.PreDisplay;
IOtherInterface displayAsOther = display as IOtherInterface;
if(displayAsOther != null)
{
    displayAsOther.OtherMethod();
}
Run Code Online (Sandbox Code Playgroud)


Nol*_*rin 6

使用接口的整个目的是执行代码不必知道确切的类型.尝试通过界面本身公开您可能需要的所有信息,因此您无需进行投射.

可以理解的是,您可能仍需要在极少数情况下将接口强制转换为具体实现(特定类型).如果您可以提供更多上下文,那可能会有所帮助.