使用接口约束强制转换泛型类型

时间:2013-07-30 20:07:37

标签: c# generics interface casting

我有以下类和接口

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。希望这会有所帮助。

2 个答案:

答案 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> {}