我在基础库项目中定义了以下接口:
public interface IWorkContext {
T User<T>() where T : IUser;
// Note this method is kind of a shortcut so i don't
// have to keep passing in T
IUser User();
}
public interface IUser {
int Id { get; }
string UserName { get; }
}
现在我有另一个项目使用以下类引用上面的类(实现IUser)。
public class User : IUser {
public virtual int Id { get; set; }
public virtual string UserName { get; set; }
// ... Code removed for brevity
}
现在我还需要实现IWorkContext。这是我的第一次尝试:
public class DefaultWorkContext : IWorkContext {
private readonly IUsersService _usersService;
public DefaultWorkContext(IUsersService usersService) {
_usersService = usersService;
}
public T User<T>() where T : IUser {
return _usersService.GetUser<T>(1));
}
public User User() {
return User<User>();
}
}
但是这会产生错误:
类型'T'不能用作泛型类型中的类型参数'T' 或方法'... GetUser(int)'。没有拳击转换或类型 参数从“T”转换为“用户”。
我确信有一些根本我做错了。我很感激任何关于这个模型的建议都可以改进。感谢
编辑(根据请求,这是GetUser方法):
public T GetUser<T>(int id) where T : User {
return _session.Get<T>(id);
}
注意:_session是一个NHibernate会话。
答案 0 :(得分:2)
这里的问题是您将一个泛型类型作为类型参数传递给GetUser()
方法,可能不满足您的{接受的泛型类型的继承条件{1}}方法。
编译器确保作为参数传递的类型始终满足类型条件。
实际上,您可以编写GetUser()
来实现class NotUser
而不是IUser
。
然后使用User
作为类型参数调用User<T>()
方法 ,这将导致调用NotUser
,其类型参数不会继承来自GetUser()
。
您的User
方法只接受继承自GetUser()
。
您需要更改User
原型以接受实现GetUser()
的泛型类型,或IUser
原型仅接受继承自User<T>
的泛型类型。< / p>
要么:
User
或者这个:
public T GetUser<T>(int id) where T : IUser {
return _session.Get<T>(id);
}
修改强> 的 是否应该选择第一种或第二种方法取决于您想要做什么。
1)您希望public T User<T>() where T : User {
return _usersService.GetUser<T>(1));
}
使用IWorkContext
界面,并且您接受IUser
方法返回GetUser()
=&gt;选择选项1
2)您希望IUser
方法采用继承自GetUser()
的类型,并且您接受User
接口与IWorkContext
而不是{{1}一起使用}} =&gt;选择选项2,然后修改User
界面。
对我来说,选项1)更好,因为您不需要修改界面,也不会破坏通用性。但这取决于你想要做什么。