[英]using Generic interface type as basis for interface parameter type
我有以下内容:
class Item {
public object ItemId {get;set;}
}
class StringItem : Item {
public new string ItemId {get;set;}
}
interface IItemRepository<out T> : where T : Item {
T GetItem(object itemId);
}
我想要的是能够根据我正在使用的实现将ItemId替换为ItemId的类型。 我可以使用IItemRepository来实现它,其中U是ItemId类型,但我想将itemId类型直接绑定到ItemId属性类型。 另外,我不一定要将IItemRepository用作接口。 我可以把它变成一个抽象类,但我也没有看到一种简单的方法来做到这一点。
所以,最终的结果是我能做到:
StringItemRepository : IItemRepository<StringItem> {
StringItem GetItem(string itemId) { ... }
}
这将满足接口。 有没有办法做这样的事情:
T GetItem(typeof(T.ItemId.GetType()) itemId);
更新:我不能简单地做IItemRepository,因为我将有多个Item的实现。 每个实现也将有一个存储库(可能是多个)。 所以,最终的WebService将具有以下内容:
IEnumerable<IItemRepository<Item>> Repositories;
此存储库列表将用于生成所有不同类型的项目。 我需要能够区分Foo:Item和Bar:Item ...我可能只需要将ItemIdType传递给Repository,但它只是感觉笨重。 好像我在重复自己,应该有一些方法来重构这个,所以我没有必要。
另一个更新...所以...这就是我开始提出的:
class Item<T> {
public T id {get;set;}
}
class StringItem : Item<string> {
public string id {get;set;}
}
interface IItemRepo<T> {
Item<T> GetItem(T id);
}
class StringItemRepository : IItemRepo<string> {
public StringItem GetItem(string id) { return null}
}
问题是我需要StringItemRepository.GetItem来吐出StringItems,而不是Item对象。 我当前的实现不起作用因为StringItemRepository没有实现GetItem因为它没有返回Item ...你会认为因为StringItem是一个它可以工作的项目,但没有这样的运气。
我想在创建存储库时我将不得不使用2种泛型类型(包括StringType和String),除非其他人有其他解决方案。
好的......所以,这有效:
class Item<T> {
public T id {get;set;}
}
class StringItem : Item<string> {
public string id {get;set;}
}
interface IItemRepo<T> {
Item<T> GetItem(T itemId);
}
class StringItemRepository : IItemRepo<string> {
public Item<string> GetItem(string itemId) {
return new StringItem();
}
}
我被挂起来让GetItem有一个stringItem作为返回类型,但我可以返回一个StringItem,因为它类型为Item ...这将完美地运行...感谢所有帮助...
听起来你应该让Item
开头 - 然后你根本不需要StringItem
,它的属性隐藏:
class Item<T> {
public T ItemId { get; set; }
}
interface IItemRepository<T> {
Item<T> GetItem(T itemId);
}
为什么不实现这个;
public class Item<T>
{
public T ItemId { get; set; }
}
public class StringItem<T> : Item<T>
{
}
public interface IItemRepository<T>
{
Item<T> GetItem(T itemId);
}
public class StringItemRepository<T> : IItemRepository<T>
{
public Item<T> GetItem(T itemId)
{
throw new NotImplementedException();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.