c#使用泛型类型在接口类型之间进行转换
我有一个类c#使用泛型类型在接口类型之间进行转换,c#,generics,interface,casting,C#,Generics,Interface,Casting,我有一个类MockRepository,它实现了接口IRepository,我还有一个类技术,它实现了接口IIdentifiable 我想将对象从MockRepository强制转换为IRepository,并在某些操作完成后再次强制转换。这可能吗?我的代码可以编译,但当我尝试运行它时,我得到一个无效的强制转换异常。简短的回答是否 如果您有一个接口IMyInterface,那么编译器将为您使用的每种类型的T创建一个新接口,并替换T的所有值 举个例子: 我有一个界面: public interfa
MockRepository
,它实现了接口IRepository
,我还有一个类技术
,它实现了接口IIdentifiable
我想将对象从MockRepository
强制转换为IRepository
,并在某些操作完成后再次强制转换。这可能吗?我的代码可以编译,但当我尝试运行它时,我得到一个无效的强制转换异常。简短的回答是否
如果您有一个接口IMyInterface
,那么编译器将为您使用的每种类型的T创建一个新接口,并替换T的所有值
举个例子:
我有一个界面:
public interface IMyInterface<T> {
public T Value {get; set;}
}
然后我定义如下
public class Orange : IMyInterface<Foo> {}
public class Banana : IMyInterface<Bar> {}
public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
}
如您所见,RandomInterface
和AlternativeInterface
之间没有关系。因此,从RandomInterface
继承的类不能强制转换为AlternativeInterface
阅读问题评论后更新
如果希望将MockRepository传递给需要IRepository的函数,可以执行以下操作
public class Orange : IMyInterface<Foo> {}
public class Banana : IMyInterface<Bar> {}
public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
}
public void MyFunction(假定回购),其中T:i可识别{
}
简短的回答是否定的
如果您有一个接口IMyInterface
,那么编译器将为您使用的每种类型的T创建一个新接口,并替换T的所有值
举个例子:
我有一个界面:
public interface IMyInterface<T> {
public T Value {get; set;}
}
然后我定义如下
public class Orange : IMyInterface<Foo> {}
public class Banana : IMyInterface<Bar> {}
public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
}
如您所见,RandomInterface
和AlternativeInterface
之间没有关系。因此,从RandomInterface
继承的类不能强制转换为AlternativeInterface
阅读问题评论后更新
如果希望将MockRepository传递给需要IRepository的函数,可以执行以下操作
public class Orange : IMyInterface<Foo> {}
public class Banana : IMyInterface<Bar> {}
public void MyFunction<T>(IRepository<T> repo) where T: IIdentifiable {
}
public void MyFunction(假定回购),其中T:i可识别{
}
我想你有:
class MockRepository<T> : IRepository<T> // note: same T
{
}
interface IRepository<out X> // note: "out" means covariance in X
{
}
class-MockRepository:IRepository//note:same T
{
}
接口i假设//注:“out”表示X中的协方差
{
}
然后,因为技术
是一种可识别的
,协方差给出了i假设
也是一种i假设
因此,如果您的I假设接口是(或可以是)协变的,它应该可以工作。我认为您有:
class MockRepository<T> : IRepository<T> // note: same T
{
}
interface IRepository<out X> // note: "out" means covariance in X
{
}
class-MockRepository:IRepository//note:same T
{
}
接口i假设//注:“out”表示X中的协方差
{
}
然后,因为技术
是一种可识别的
,协方差给出了i假设
也是一种i假设
因此,如果您的i假设接口是(或可以是)协变的,那么它应该可以工作。为什么您要这样做?为了澄清@antonijn的问题,为什么您需要投射这些对象MockRepository
已经是IRepository
,因此您可以获得所有IRepository
功能,技术
是可识别的
,因此您也可以获得该接口实现。也许,如果您向我们展示如何使用它们,以及您试图通过此转换实现什么,我们可以为您提供更多帮助。通常,您可以在希望强制转换到IRepository
的所有情况下使用MockRepository
,它应该可以在不首先强制转换的情况下工作。如果还有其他原因,请提供一些代码来澄清您的问题。若要将其作为参数传递给将IRepository
作为参数类型的函数,请执行以下操作。如果我将参数类型定义为MockRepository
,那么我不能将其用于实际的存储库对象和从repositories获取的其他可识别对象。该参数必须包含相关的代码位和完整的错误消息。事实上,很难正确回答。类定义会有所帮助。请记住,泛型集合是不可互换的,所以和弥补了两种不同的集合类型。为什么要这样做?为了澄清@antonijn的问题,为什么需要强制转换这些对象MockRepository
已经是IRepository
,因此您可以获得所有IRepository
功能,技术
是可识别的
,因此您也可以获得该接口实现。也许,如果您向我们展示如何使用它们,以及您试图通过此转换实现什么,我们可以为您提供更多帮助。通常,您可以在希望强制转换到IRepository
的所有情况下使用MockRepository
,它应该可以在不首先强制转换的情况下工作。如果还有其他原因,请提供一些代码来澄清您的问题。若要将其作为参数传递给将IRepository
作为参数类型的函数,请执行以下操作。如果我将参数类型定义为MockRepository
,那么我不能将其用于实际的存储库对象和从repositories获取的其他可识别对象。该参数必须包含相关的代码位和完整的错误消息。事实上,很难正确回答。类定义会有所帮助。但请记住,泛型集合是不可互换的,因此,和弥补了两种不同的集合类型。