动态类型列表

时间:2013-06-03 19:01:11

标签: c# .net

我想知道这是否可能,我想要做的是在创建此类的实例时设置列表类型。

class MyClass
{
    private Type _type = typeof(string);
    public MyClass(Type type)
    {
        this._type = type;
    }

    public List<_type> MyList { get; set; }  <----it does not like this
}

4 个答案:

答案 0 :(得分:8)

使用泛型类型定义:

class MyClass<T>
{   
    private Type _type = typeof(string);
    public MyClass()
    {
        this._type = typeof(T);
    }

    public List<T> MyList { get; set; }  <----it likes this
}

如果您需要接受传递的Type参数并且泛型不起作用,您可以执行以下操作:

class MyClass
{   
    private Type _type = typeof(string);
    public MyClass(Type type)
    {
        this._type = typeof(type);
        this.MyList = Activator.CreateInstance(typeof(List<>).MakeGenericType(type));
    }

    public IList MyList { get; set; }  <----it likes this
}

优点是它在列表上强制执行类型约束。只能将给定类型的项添加到列表中。缺点是您需要投射从中获得的每个项目。如果你避免这种事情并使用上面的通用例子会更好。第三种选择是完全忽视泛型:

class MyClass
{   
    private Type _type = typeof(string);
    public MyClass(Type type)
    {
        this._type = typeof(type);
        this.MyList = new ArrayList();
    }

    public IList MyList { get; set; }  <----it likes this
}

这不提供任何类型强制执行。您的里程可能会有所不同。

答案 1 :(得分:6)

class MyClass <T>
{
    public List<T> MyList { get; set; }
}

答案 2 :(得分:2)

使用泛型很容易:

class MyClass<T>
{
    public List<T> MyList { get; set; } 
}

http://msdn.microsoft.com/en-us/library/512aeb7t(v=vs.80).aspx

答案 3 :(得分:1)

class MyClass<T>
{
    public MyClass()
    {
        MyList = new List<T>();
    }

    public List<T> MyList { get; set; }
}

并使用:

MyClass<string> x = new MyClass<string>();
x.MyList.Add("asdf");