C# 我们可以使用接口变量调用接口中未定义的实现类中的方法吗?

C# 我们可以使用接口变量调用接口中未定义的实现类中的方法吗?,c#,oop,C#,Oop,是否可以使用接口变量调用接口的实现类中未定义的方法,如下所示: interface ILookup { public void someInterfaceMethod1(); public void someInterfaceMethod2(); } …和实现类: public class extendedLookUpImplementor: ILookup { //constructor LookUpIm

是否可以使用接口变量调用接口的实现类中未定义的方法,如下所示:

interface ILookup {
            public void someInterfaceMethod1();
            public void someInterfaceMethod2();
}
…和实现类:

public class extendedLookUpImplementor: ILookup
{
          //constructor
          LookUpImplementor(){
          }

          public void someInterfaceMethod1(){
           // Implementation Code here.
          }

          public void someInterfaceMethod2(){
           // Implementation Code here.
          }

          public void ExtendedMethod(){
           // Implementation Code here.
          }

}
在客户端代码中:

ILookup lookupVar = new LookUpImplementor();
lookupVar -> someInterfaceMethod1(); // i know it will work.
lookupVar -> someInterfaceMethod2(); // i know it will work.
我的问题是,我是否可以使用lookupVar调用ExtendedMethod,如下所示:

lookupVar -> ExtendedMethod(); // Note again that ExtendedMethod() is not defined in Ilookup interface/contract.

只有通过将lookupVar转换为extendedLookUpImplementor,或者通过反射,我认为。

首先,正如Ian1971所说,是的,您可以将它转换为特定类型,比如

ILookup lookupVar = new LookUpImplementor();
((extendedLookUpImplementor)lookupVar).ExtendedMethod(); //this should work
或者使用动态/反射

话虽如此,我真的不认为这是一个好方法,因为这会违反合同/接口的目标之一

例如,如果我们有ILookup变量“lookupVar”

在任何时候,使用对象lookupVar的代码都不能保证会有方法ExtendedMethod,并且可以在运行时引发异常


我真正想问你们的问题是,为什么你们想添加一个不能添加到合同中的方法,你们的目标是什么。如果该方法正在扩展类,请尝试在您的场景中使用它们。

我认为在c中,您可以调用像
object.method()
这样的方法,而在这里您实现的不是扩展(只是一个注释)否,因为
lookupVar
属于
ILookup
类型。我一直在考虑您的问题,也许您正在寻找一种方法来扩展接口
ILookup
?或者通过反射,或者使用
dynamic
,但是如果您有一个对派生类型的编译时引用,那么强制转换无疑是一种方法。如果你没有编译时的引用,那么也许需要考虑一下设计的改变,如果有必要的话,只需要去思考/<代码>动态< /COD>路由。在发布和更新答案之后,我就意识到了反射的可能性。非常感谢Adil,你的答案是详细的,帮助了我很多。我问这个问题的原因如下所述,并补充了一些更多的信息,说明了这个问题产生的原因或来源。我使用的程序中,接口在单独的层中编译,不可更改。因此,我需要实现接口,并在不更改接口的情况下扩展功能。出于一些好的原因,我还想继续使用来自客户机/调用程序的相同接口调用实现类(因为我不想创建新接口,也不想在客户机程序的多个位置进行更改)。所以,我希望客户机程序中以前的代码继续使用已实现的函数,同时可以使用相同的接口变量调用扩展函数。
dynamic lookup = lookupVar;
lookup.ExtendedMethod(); //this would work