将列表的类型保持模糊,直到填充

时间:2016-05-12 16:04:20

标签: c# .net class oop

在用户定义的类中,我希望使List的类型不明确,以便我可以在类的不同实例中有一个字符串或整数或元组的列表(也就是说,每个list只有一种类型,但类的不同实例会有不同的类型)。我目前有类似的东西:

public Result
{
    private List<dynamic> _vaguelist;
    public List<dynamic> vaguelist {
        get
        {
            return _vaguelist;
        }
        set
        {
            _vaguelist = value;
        }
    }
}

但是,我很确定我没有正确使用动态类型。我想我需要一个构造函数来创建一个新的List,其中T是从添加到Class的第一个值的GetType()中确定的。或者在初始化时将List指定为特定类型。

简而言之,如何在类中定义一个列表,使其值的类型可以是添加到列表中的任何内容的固有值,也可以在实例化类时指定? (单个列表中的值都是一种类型)。

2 个答案:

答案 0 :(得分:3)

我认为你有两个选择,第一个是最好的方法,只有你知道列表属于某种类型才会有效。

public class Result<T>
{
    private List<T> _vaguelist = new List<T>();
    public List<T> vaguelist {
        get
        {
            return _vaguelist;
        }
        set
        {
            _vaguelist = value;
        }
    }
}

Result a = new Result<string>();
a.vaguelist.Add("1234");
Result b = new Result<int>();
a.vaguelist.Add(1234);

如果您不想在列表中添加多种类型,则第二个选项将有效o您不知道自己将哪些类型放入列表中

public class Result
{
    private List<object> _vaguelist;
    public List<object> vaguelist {
        get
        {
            return _vaguelist;
        }
        set
        {
            _vaguelist = value;
        }
    }
}

Result a = new Result();
a.vaguelist.Add("1234");
a.vaguelist.Add(1234);

这种方法的问题在于您必须在列表中投射每个项目才能利用项目的类型。

利用第一种方法,您可以像这样实现它:

public class Result<T>
{
    private List<T> _vaguelist = new List<T>();
    public List<T> vaguelist {
        get
        {
            return _vaguelist;
        }
        set
        {
            _vaguelist = value;
        }
    }
}

public abstract class Result
{
    public static Result<T> NewResultFromItem<T>(T item)
    {
        Result<T> result = new Result<T>();
        result.vaguelist.Add(item);

        return result;
    }
}

string item1 = "123";
string item2 = "234";
var result = Result.NewResultFromItem(item1);
result.vaguelist.Add(item2);

答案 1 :(得分:1)

你要求的是类型安全和类型不可知论(我只是编造了这个词),你不能同时拥有它们。假设在添加第一个项目时,您会找到一种方法使列表在运行时转换为类型安全集合。如果你不能对它进行编码,谁或什么能够使用它呢?编译器不会知道它在运行时会是什么,因此对于类型安全没有太多可以做的。在运行时,你仍然需要弄清楚你正在处理什么,所以从编码的角度来看它仍然只是一个对象列表。