0
public abstrct class Item
{
   public string Name {get;set;}
}

public class Music : Item
{
    public double Price {get;set;} 
}

public class Game : Item
{
  public string Image {get;set;}
}

public class Inventory
{

private IList<Item> _games;
private IList<Item> _musics;

public Inventory()
{
  _games = new List<Item>();
  _musics = new List<Item>();
}

public void Add<T>(T item) where T : Item
{
if(typeof(T) == typeof(Game))
{
    _game.add(item);
}
if(typeof(T) == typeof(Music))
{
    _muisc.add(item);
}


public List<T> GetCollection<T>() where T : Item
{
  return (List<T>) _muiscs;
}

class Porgram
{
  static void Main(string[] args)
{
   Inventory inventory = new Inventory();
   var music1 = new Music(){ Name ="aa", Price = 10};
   var Music2 = new Music() { Name ="bb", price = 20 };

inventory.add(music1);
inventory.add(music2);


List<Music> myMusics = inventory.GetCollection<Music>();


}

代码将编译,但在尝试调用 Get Collection 方法时会抛出异常。

我不确定为什么?我猜我使用的泛型不正确。

4

3 回答 3

2

List<Item> 不能转换为 List<Music>。虽然 Music 是 Item 的子类,但泛型类型不遵循与其集合类型相同的继承模式。修复代码的最简单方法是将 GetCollection 方法中的转换替换为调用 Linq 扩展方法转换,然后调用 ToList。也就是说,我认为您的整个类可以重新设计以更好地处理这种继承。

因此,您的 GetCollection 方法如下所示:

public List<T> GetCollection<T>() where T : Item
{
    return _musics.Cast<T>().ToList();
}
于 2012-10-24T21:52:55.417 回答
0

只需将您的 GetCollection 方法修改为

public List <T> GetCollection<T>() where T :Item
        {

            if (typeof(T) == typeof(Game))
            {
                return _games.Cast<T>().ToList();
            }
            if (typeof(T) == typeof(Music))
            {
                return _musics.Cast<T>().ToList(); ;
            }
        return null;
        }
于 2012-10-24T22:01:35.950 回答
0

试试这个代码:

public abstract class Item
{
    public string Name { get; set; }
}

public class Music : Item
{
    public double Price { get; set; }
}

public class Game : Item
{
    public string Image { get; set; }
}

public class Inventory<E> where E : Item
{

    private IList<E> _games;
    private IList<E> _musics;

    public Inventory()
    {
        _games = new List<E>();
        _musics = new List<E>();
    }

    public void Add(E item)
    {
        if (typeof(E) == typeof(Game))
        {
            _games.Add(item);
        }
        if (typeof(E) == typeof(Music))
        {
            _musics.Add(item);
        }
    }


    public List<E> GetCollection()
    {
        return _musics;
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Inventory<Item> inventory = new Inventory<Item>();
        var music1 = new Music() { Name = "aa", Price = 10 };
        var music2 = new Music() { Name = "bb", Price = 20 };

        inventory.Add(music1);
        inventory.Add(music2);


        List<Item> myMusics = inventory.GetCollection();


    }
}

您需要将您的 Inventory 类声明为通用的,它需要一个扩展的类Item

另外:看起来你写了代码,并没有复制和粘贴它......我不知道你为什么这样做......

于 2012-10-24T21:51:40.610 回答