C# 接口签名相同的接口之间的强制转换

C# 接口签名相同的接口之间的强制转换,c#,.net,casting,C#,.net,Casting,当两个接口的签名相同时,是否可以从一个接口强制转换到另一个接口?下面的源代码给出了无法将类型为“ConsoleApplication1.First”的对象强制转换为类型为“ConsoleApplication1.ISecond”的异常 class Program { static void Main(string[] args) { IFirst x = new First(); ISecond y = (ISecond)x; y.

当两个接口的签名相同时,是否可以从一个接口强制转换到另一个接口?下面的源代码给出了
无法将类型为“ConsoleApplication1.First”的对象强制转换为类型为“ConsoleApplication1.ISecond”的异常

class Program
{
    static void Main(string[] args)
    {
        IFirst x = new First();
        ISecond y = (ISecond)x;
        y.DoSomething();
    }
}

public interface IFirst
{
    string DoSomething();
}

public class First : IFirst
{
    public string DoSomething()
    {
        return "done";
    }
}

public interface ISecond
{
    string DoSomething();
}
当两个接口的签名相同时,是否可以从一个接口强制转换到另一个接口

不。就CLR和C而言,它们是完全不同的类型


您可以创建一个“桥接”类型,它封装了
IFirst
的实现,并通过委托实现了
ISecond
,反之亦然。

我可以想到的一种方法是:

public interface IDoSomething
{
   string DoSomething();
}

public interface IFirst : IDoSomething {}

public interface ISecond : IDoSomething {}
然后,不要按“第一个”或“第二个”进行转换,而是按“我”进行转换。

因为,不,你不能

如果您的问题是编写真正的泛型代码,并且如果您不控制接口(如中所述),那么您仍然可以在C#中通过两种方式来实现这一点:

1-反射 …使用反射查询要调用的方法:

object x = new First();

Type t = x.GetType();
MethodInfo mi = t.GetMethod("DoSomething");
mi.Invoke(x, new object[]{}); // will call x.DoSomething
2-动态(C#4) 在C#4中,使用
dynamic
关键字在运行时而不是编译时解析调用:

object x = new First();

dynamic d = x ;   // every call through d will be resolved at runtime
d.DoSomething() ; // compiles (but will throw if there is no 
                  // "DoSomething" method

我想将一个与System.Web.Compilation.IResourceProvider具有相同签名的对象传递给ASP.NET的资源提供程序模型。我已经创建了一个自定义资源提供程序,我想在ASP.NET和WindowsService中重复使用它。自定义资源提供程序放在实用程序库中,我不想在该DLL中引用System.Web,因为它应该在两种不同类型的应用程序之间共享。我也不想创建一个转发类,即只向自定义资源提供程序传递方法调用的类。