2013-06-03 88 views
2

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

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 
} 
+1

最简单的解决办法是让类通用... –

回答

8

使用泛型类型定义:如果你需要接受Type参数所传递和泛型将无法正常工作,你可以这样做

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

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

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

忍者4秒,bu你的答案更美丽,更完整。 – Renan

+0

因此,给定一个'Type'对象时,如何创建一个'MyClass'实例?这只是推迟了这个问题。答案似乎认为,OP实际上并不需要那样做。这可能是也可能不是真的;我们无法真正了解。 – Servy

+0

@Servy例如,您可以执行类似“MyClass foo = new Myclass ()”的操作。只要用你想要的任何类型替换int。 – Renan

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

这是我的问题的解决方案。谢谢, –

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");