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

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

4

3 回答 3

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;
            }
        }
于 2011-07-15T02:42:21.167 回答
1

您的 GetKeys<T> 要求T 必须具有公共无参数构造函数

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

这对 T 的约束允许您在方法主体中编写如下代码:

T t = new T();

由于您没有使用它,而是期望某个其他构造函数(不能像公共无参数构造函数那样强制执行),因此只需删除约束,它应该可以工作。

于 2011-07-15T02:42:17.793 回答
0

由于您为了使用此方法而将相似性构建到类中,因此最好让它们都扩展相同的接口(或继承相同的基类,只要适合您的应用程序)。然后,您只需要使用传入的构造函数参数来构建基类列表。然后在调用代码中,您可以适当地转换列表项。

于 2011-07-15T02:42:54.703 回答