0

この質問は、この以前に尋ねられた質問への追加です。

初期化する必要のある子クラスとリスト型になる基本クラス

abstract public class baseClass
{
    public baseClass()
    {
    }
}

public class child1 : baseClass
{
    public child1() : base
    {
    }
}

public class child2 : baseClass
{
    public child2() : base
    {
    }
}

私の列挙型とマネージャークラス

public enum ClassType
{
    child1,
    child2
}

public class Manager
{
    private List<baseClass> _children;

    public void Initialise(ClassType type)
    {
        var temp = Activator.CreateInstance(null, type.ToString()); 
        //null = assembly which means this assembly
        _children.Add(temp);
    }
}

マネージャークラスは、私の前の質問から提案された回答に更新されました。しかし、まだ何かが間違っています。上記の場合、次のエラーが発生します。TypeLoadExceptionが処理されませんでした:アセンブリ'Something'からタイプ'child2'を読み込めませんでした。これを変更するにはどうすればよいですか?私は成功せずに他のいくつかのオプションを試しました。(一部はクラスの作成になりますが、追加するとnullReferenceExceptionになります)。

編集 :

コードを次のように変更しました。

string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
Type objType = Type.GetType(string.Format("{0}.{1},{0}", assemblyName, type.ToString()));
var temp = (baseClass)Activator.CreateInstance(objType, 1);
// 1 is the parameter I need to add to the constructor.
_children.Add(temp);

これで正しいクラスが作成されましたが、クラスをリストに追加するとNullReferenceExceptionが発生します:(

4

2 に答える 2

1

クラスが名前空間化されている可能性があるため、タイプが見つからない可能性があります。

つまり、のタイプ名は、child2だけでchild2なく、である可能性がありますSomeNamespace.child2

余談ですが、これは本当にクレイジーなパターンのようbaseClassです。代わりにコンストラクターを使用することをお勧めします。

于 2013-03-17T13:22:47.077 に答える
0

提供されているコードは、これが原因で期待どおりにコンパイルまたは動作することさえ ありません。実際に作成したタイプではなく、Activator.CreateInstance戻り値です。System.Runtime.Remoting.ObjectHandleもちろん、にキャストする必要がありますbaseClass
さらに、Danirelが提案しているように、このメソッドを使用するときは名前空間を指定する必要があります。

于 2013-03-17T13:35:38.293 に答える