从字符串中确定类的类型,并将其用作SortedList中的TVal

本文关键字:SortedList TVal 中的 字符串 类型 | 更新日期: 2023-09-27 18:12:38

作为序言,我试图使用一些将数据库表映射到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,然后强制转换activator结果。
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();
}

从字符串中确定类的类型,并将其用作SortedList中的TVal

这不是泛型的工作方式。泛型是编译时构造,当您试图在运行时确定类型时。既然你无论如何都要强制转换或使用反射,为什么不直接使用SortedList<int, object>SortedList<int, {some other base class}>呢?

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]});

你可以做一个类似的方法,只是添加一个项目到现有的项目,然后以同样的方式调用它