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,因为它应该在两种不同类型的应用程序之间共享。我也不想创建一个转发类,即只向自定义资源提供程序传递方法调用的类。