前置きとして、いくつかの内部開発ツール用にデータベース テーブルを C# にマップするいくつかのクラスを使用しようとしています。私がやろうとしているのは、文字列を使用してクラス タイプを指定し、そのクラスのタイプを並べ替えられたリストの TVal として使用し、最後に Activator を使用してクラスをインスタンス化し、リストに追加することです。
これが可能であると仮定すると、私の主な問題はSortedList
、Activator
行で「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();
}