日期:2014-05-18  浏览次数:20920 次

如何 建立 Type的实例??
我现在知道,除了泛型方法可以动态建立一个对象的实例,如:

private void NewMDIForm<T>(ref T fVar) where T:Form,new()
{
  if (fVar == null)
  {
  fVar = new T(); //这样T就是一个动态的类型了!
  fVar.MdiParent = this;
  }
  fVar.Show();
}

上面的方法可以动态建立一个字窗体并显示出来.
但现在我要一个窗体的构造函数实现类似的动态建立对象的功能.可是发现窗体的构造函数好象不能使用泛型...

于是,想到:
public MyForm(Type t)
{
  FMyobj=....; //想在这里使用t来建立t指定的对象. 可能吗?
}

不知道上面的想法可行否?请高手指点一下.

------解决方案--------------------
反射...
------解决方案--------------------
object objInfo = RuntimeHelpers.GetObjectValue(Activator.CreateInstance(type));
------解决方案--------------------
LZ可以参考下

构造泛型类型的实例
1.获取表示泛型类型的 Type 对象。下面的代码以两种不同方式获取泛型类型 Dictionary:一种方法使用 System.Type.GetType(System.String) 方法重载和描述类型的字符串,另一种方法调用构造类型 Dictionary<String, Example>(在 Visual Basic 中为 Dictionary(Of String, Example))的 GetGenericTypeDefinition 方法。MakeGenericType 方法需要泛型类型定义。


Type d1 = typeof(Dictionary<,>);
Dictionary<string, Example> d2 = new Dictionary<string, Example>();
Type d3 = d2.GetType();
Type d4 = d3.GetGenericTypeDefinition();

2.构造一组用于替换类型参数的类型变量。数组必须包含正确数目的 Type 对象,并且顺序和对象在类型参数列表中的顺序相同。在这种情况下,键(第一个类型参数)的类型为 String,字典中的值是名为 Example 的类的实例。

Type[] typeArgs = {typeof(string), typeof(Example)};

3.调用 MakeGenericType 方法将类型变量绑定到类型参数,然后构造类型。

Type constructed = d1.MakeGenericType(typeArgs);

4.使用 CreateInstance 方法重载来创建构造类型的对象。下面的代码在生成的 Dictionary<String, Example> 对象中存储 Example 类的两个实例。

object o = Activator.CreateInstance(constructed);


------解决方案--------------------
Activator.CreateInstance(t, new object[] {3});
这个也可以的