使用类型参数返回所述类型数组的方法
本文关键字:类型 数组 方法 类型参数 返回 | 更新日期: 2023-09-27 18:02:23
我试图在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 found
。MyClass
是包含上述方法的类。MyOtherClass
是作为T
传入的类。
任何帮助将不胜感激,谢谢!
只要你的构造函数看起来像这样,这应该可以为你工作:
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;
}
}
对T的约束允许您在方法体中编写这样的代码: 因为你不使用这个,但期望一个特定的其他构造函数(不能像公共无参数构造函数那样强制),只要删除约束,它应该工作。private T[] GetKeys<T>(...) where T : new()
↑
T t = new T();
因为您是为了这个方法而在类中构建相似之处,所以最好让它们都扩展相同的接口(或继承相同的基类,任何适合您的应用程序的方法)。然后,您只需要使用传入的构造函数参数来构建基类列表。然后在调用代码中,您可以根据需要转换列表项。