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

それはジェネリックがどのように機能するかではありません。ジェネリックはコンパイル時の構成要素ですが、実行時に型を決定しようとしています。とにかくリフレクションをキャストまたは使用する必要があるので、単にまたはを使用しないのはなぜSortedList<int, object>ですかSortedList<int, {some other base class}>?

于 2013-05-08T00:25:48.093 に答える