强制转换为未明确实现的接口?

假设你定义了一些任意的接口:

public interface IInterface {
    void SomeMethod();
}

假设有一些类碰巧拥有匹配的公共接口,尽管它们没有“实现IInterface ”。 IE:

public class SomeClass {
    public void SomeMethod() {
       // some code
    }
}

是否还有一种方法可以获得对SomeClass实例的IInterface引用? IE:

SomeClass myInstance = new SomeClass();
IInterface myInterfaceReference = (IInterface)myInstance;

不,没有办法做到这一点。 如果类型没有实现接口,那么就没有办法投射到它。 实现类似于所需行为的最佳方式是创建一个包装类型,它为SomeClass提供了IInterface的实现。

public static class Extensions {
  private sealed class SomeClassWrapper : IInterface {
    private readonly SomeClass _someClass;

    internal SomeClassWrapper(SomeClass someClass) {
      _someClass = someClass;
    }

    public void SomeMethod() {
      _someClass.SomeMethod();
    }
  }

  public static IInterface AsIInterface(this SomeClass someClass) {
    return new SomeClassWrapper(someClass);
  }
}

然后你可以拨打以下电话

SomeClass myInstance = new SomeClass();
IInterface myInterface = myInstance.AsIInterface();

如果你有权访问源代码,你总是可以装饰这个类,如果没有,你可以做一个包装:

public class InterfaceWrapper : IInterface
{
    private readonly SomeClass _someClass;

    public InterfaceWrapper(SomeClass someClass) { _someClass = someClass; }

    public void SomeMethod() { _someClass.SomeMethod(); }
}

不是。仅仅因为两个班级碰巧有同名的方法并不意味着他们遵守同一个合同。 这就是为什么您通过明确实施合适的界面来定义合同的原因。

链接地址: http://www.djcxy.com/p/43725.html

上一篇: Cast to not explicitly implemented interface?

下一篇: How to determine if a type implements an interface with C# reflection