0

作为序言,我正在尝试使用一些将数据库表映射到 C# 的类,以用于一些内部开发工具。我试图做的是使用一个字符串来指定一个类类型,然后将该类的类型用作排序列表中的 TVal,最后使用 Activator 实例化该类并将其添加到列表中。

假设这是可能的,我认为我的主要问题是不知道如何在SortedListActivator行中使用“classType”的正确语法。

以下内容不起作用,但希望它能清楚地说明我要完成的工作。

string className = "ClassName";
System.Type classType = Type.GetType(className);
SortedList<int,classType> rcdsList = new SortedList<int,classType>();
rcdsList.Add(key,(classType)Activator.CreateInstance(classType , paramArray));

编辑:自从我发布原始问题以来,这就是我最终想出的解决方案。基本上它是使用基类设置 SortedList,然后转换激活器结果。

string tableClassName = "Table_" + tableNames[i];
System.Type targetType = Type.GetType("DbUtilities." + tableClassName);

SortedList<int, DbUtilities.DbObjectTableBase> rcdsList = new SortedList<int, DbUtilities.DbObjectTableBase>();

while (!rcd.EOF)
{
    object[] paramArray = new object[rcd.Fields.Count];

    for (int j = 0; j < rcd.Fields.Count; j++)
    {
        paramArray[j] = rcd.Fields[j].Value;
    }

    DbUtilities.DbObjectTableBase obj = (DbUtilities.DbObjectTableBase)Activator.CreateInstance(Type.GetType(targetType.AssemblyQualifiedName), paramArray);

    rcdsList.Add(Convert.ToInt32(rcd.Fields[0].Value), obj);
    rcd.MoveNext();
}
4

2 回答 2

3

这不是泛型的工作方式。泛型是一个编译时构造,而您试图在运行时确定类型。既然你无论如何都必须投射或使用反射,为什么不只使用 a SortedList<int, object>or SortedList<int, {some other base class}>

于 2013-05-08T00:25:48.093 回答
0
public static class Helper {
  public static SortedList<int,T> SetupList<T>(int key, object[] paramArray) {
    var rcdsList = new SortedList<int,T>();
    rcdsList.Add(key, (T)Activator.CreateInstance(typeof(T), paramArray));
  } 
}

然后调用你的方法(这是调用它传入 1 的键并且没有构造函数参数)

MethodInfo mi=typeof(Helper).GetMethod("SetupList");
    mi = mi.MakeGenericMethod(Type.GetType(className)); 
object result = mi.Invoke(null, new object[] { 1, new object[0]});

您可以创建一个类似的方法,将一个项目添加到现有项目,然后以相同的方式调用它

于 2013-05-08T00:53:22.687 回答