2011-07-15 46 views
0

我想在C#中创建一个泛型方法,它将返回指定类型的数组。这就是我的方法看起来像此刻:带有返回数组类型参数的方法

private T[] GetKeys<T>(string key, Dictionary<string, object> obj) where T : new() 
{ 
    if (obj.ContainsKey(key)) 
    { 
     object[] objs = (object[])obj[key]; 
     T[] list = new T[objs.Length]; 
     for (int i = 0; i < objs.Length; i++) 
     { 
      list[i] = (T)Activator.CreateInstance(
          typeof(T), 
          new object[] { 
           (Dictionary<string, object>)objs[i] 
          }); 
     } 
     return list; 
    } 
    else 
    { 
     return null; 
    } 
} 

由于这一类是内部使用,并且是不可用的库我已经知道哪些类将被放入<T>。所有的类在它们的构造器中都有相同的参数。但是在这个代码甚至编译之前,我必须给他们一个没有参数的公共构造器。现在,当我到达Activator.CreateInstance行时,我收到一个错误,说Constructor on type 'MyNamespace.MyClass+MyOtherClass' not foundMyClass是包含上述方法的类。 MyOtherClass是作为T传入的类。

任何帮助将不胜感激谢谢!

回答

2

这应该为你工作,只要你的构造是这样的:

public MyType (Dictionary<string,object> dict) 
{ 
} 

如果你的构造函数是不公开的,你需要改变GetConstructor在BindingFlags.NonPublic通过。

 private T[] GetKeys<T>(string key, Dictionary<string, object> obj) 
     // Since you're not using the default constructor don't need this: 
     // where T : new() 
     { 
      if (obj.ContainsKey(key)) 
      { 
       object[] objs = (object[])obj[key]; 
       T[] list = new T[objs.Length]; 
       for (int i = 0; i < objs.Length; i++) 
       { 
        list[i] = (T)typeof(T).GetConstructor(new [] {typeof(Dictionary<string,object>)}).Invoke (new object[] { 
             (Dictionary<string, object>)objs[i] 
            }); 
       } 
       return list; 
      } 
      else 
      { 
       return null; 
      } 
     } 
+0

理想情况下,我想构造函数是内部的。但是,我不太理解如何使用GetConstructor所需的附加参数,因此我认为我现在只需选择公共构造函数。 –

1

你GetKeys <牛逼>要求T must have a public parameterless constructor

private T[] GetKeys<T>(...) where T : new() 
             ↑ 

这限制对T允许你写这样的代码在方法中:

T t = new T(); 

既然你不使用此但期望某个其他构造函数(不能像公共无参数构造函数那样强制执行),只需删除该约束即可。

+0

谢谢,这工作! –

0

既然你正在构建的相似之处到的类此方法的缘故,很可能是最好只是让他们都继承相同的接口(或继承相同的基类,无论你的应用是合适的) 。然后你只需要使用你传入的构造函数参数来建立一个基类的列表。然后在调用代码中,您可以根据需要投射列表项目。

+0

不幸的是,构造者是这些类之间的相似之处的停止。它们传递给一个Dictionary对象,对于此方法的每次运行都有完全不同的键。这些类也没有类似的属性或方法。每个类的构造函数检查和处理字典的不同。 –

相关问题