我有以下类和接口
public interface IFoo {}
public class Foo : IFoo {}
public interface IWrapper<T> where T : IFoo {}
public class Wrapper<Foo> : IWrapper<Foo> {}
如何将Wrapper<Foo>
投射到IWrapper<IFoo>
?使用Cast(InvalidCastException)时会引发异常,因为在使用as时会得到null。
感谢您的帮助!
更新
这是一个更具体的例子:
public interface IUser {}
public class User : IUser {}
public interface IUserRepository<T> where T : IUser {}
public class UserRepository : IUserRepository<User> {}
现在我需要能够做到这样的事情:
UserRepository up = new UserRepository();
IUserRepository<IUser> iup = up as IUserRepository<IUser>;
我正在使用.net 4.5。希望这会有所帮助。
答案 0 :(得分:4)
从你的编辑中,你真的想要:
public interface IUserRepository<out T> where T : IUser {}
public class UserRepository : IUserRepository<User> {}
然后你可以这样做:
IUserRepository<IUser> iup = new UserRepository();
请注意,如果out
定义出现在T
定义中的输出位置,则只能将IUserRepository
修饰符添加到类型参数public interface IUserRepository<out T> where T : IUser
{
List<T> GetAll();
T FindById(int userId);
}
中。
public interface IUserRepository<out T> where T : IUser
{
void Add(T user); //fails to compile
}
如果它出现在输入位置的任何位置,例如方法参数或属性设置器,它将无法编译:
{{1}}
答案 1 :(得分:0)
Wrapper<Foo>
需要Wrapper<IFoo>
。然后你应该能够施展它。它也需要实现接口。
以下演员表工作......我认为您不能将对象泛型类型参数转换为其他类型(即IWrapper<Foo>
到IWrapper<IFoo>
)。
void Main()
{
var foo = new Wrapper();
var t = foo as IWrapper<IFoo>;
t.Dump();
}
public interface IFoo {}
public class Foo : IFoo {}
public interface IWrapper<T> where T : IFoo {}
public class Wrapper : IWrapper<IFoo> {}