0
4

4 回答 4

2

你可以尝试这样的事情:

public abstract class Foo<T>
{
    List<T> _List = new List<T>();
    public List<T> ListObject { get { return _List; } }
}
public class Bar : Foo<string>
{
    public List<string> ListString
    {
        get { return ListObject; }
    }
}

结果: 在此处输入图像描述

于 2013-03-24T22:56:43.320 回答
2

我希望其他人会对此提出一个相当好的答案,但现实情况是这个问题可能没有一个好的答案。

然而,有几种方法可以给普通猫剥皮,其中许多方法非常难看。

这个问题的一个丑陋的解决方案是实现一个列表类,它封装 n 个List<object>对象并尝试以您选择的任何类型访问这些对象。这种类型的代理类可能很难正确处理,但可能是一种做你想做的事情的方法。

public class StringObjectList : IList<string>
{
    private List<object> _list;
    public StringObjectList(List<object> src)
    {
        _list = src;
    }

    // IList Implementation...

    public string this[int index]
    {
        get
        {
            object obj = _list[index];
            if (obj == null)
                return null;
            return obj.ToString();
        }
        set
        {
            _list[index] = value;
        }
    }

    // ... plus 3 more IList<string> methods (IndexOf, Insert, RemoveAt)

    // ICollection<string> implementation (5 methods, 2 properties)

    // IEnumerable<string> implementation (1 method)

    // IEnumerable implementation (1 method)
}

一些实现细节有点棘手。大多数情况下,尽管实现是简单的代理方法,因为底层列表很乐意接受字符串以及任何其他对象。例如,该ICollection<string>.Add方法可以很简单:

public void Add(string item)
{
    _list.Add(item);
}

您可能遇到的问题是IEnumerable<string>IEnumerable实现,这可能需要您创建几个支持类。

不简单,不优雅,但可能可行。

于 2013-03-27T03:09:35.797 回答
0

如果您不喜欢上面的通用解决方案,您可以使List成员抽象。

public abstract class Foo
{
    public abstract IList ListObject { get; }
}

public class Bar : Foo
{
    public override IList ListObject
    {
        get { return new List<string>(); }
    }
}
于 2013-03-24T23:04:37.753 回答
0
    public abstract class Foo<T>
    {
        public abstract IList<T> MyList { get; }
        // you can manipulate MyList in this class even if it is defined in inherited class
    }

    public class Bar : Foo<string>
    {
        private readonly IList<string> _myList = new List<string>();

        public override IList<string> MyList
        {
            get { return _myList; }
        }
    }

    [TestFixture]
    public class TestFixture1
    {
        [Test]
        public void Test()
        {
            Bar oBar = new Bar();
            Foo<string> oFoo = oBar;

            oFoo.MyList.Add("Item");
            // oFoo.ListObject= { "Item" }
            // oBar.ListString = { "Item" }

            oBar.MyList.Add("NewItem");
            // oFoo.ListObject= { "Item" }
            // oBar.ListString = { "Item" }
        }

    }
于 2013-03-24T23:22:51.960 回答