10

現在、クラスタイプがあり、クラスを作成できるかどうかを知る必要がある場合。結果を呼び出しActivator.CreateInstance(type);て捨てます。

これは非常に非効率的で問題があるようです。

現在のアプリケーションに対してクラス型をインスタンス化できることを確認する別の方法はありますか?

このテストは、アプリケーションの起動時に行う必要があります。設定ミスを早期に発見できるようにするため。クラスのインスタンスが必要になるまでそのままにしておくと、修正する人がいないときにエラーが発生する可能性があります。

これが私が今していることです。

        string className = string.Format("Package.{0}.{1}", pArg1, pArg2);
        Type classType = Type.GetType(className);
        if (classType == null)
        {
            throw new Exception(string.Format("Class not found: {0}", className));
        }

        try
        {
            // test creating an instance of the class.
            Activator.CreateInstance(classType);
        }
        catch (Exception e)
        {
            logger.error("Could not create {0} class.", classType);
        }
4

2 に答える 2

11

hereにあるものに基づいて、型にパラメーターなしのコンストラクターが含まれているかどうか (提供されていない場合、どのクラスがデフォルトで含まれるか)、および型が抽象ではないかどうかをテストできます。

if(classType.GetConstructor(Type.EmptyTypes) != null && !classType.IsAbstract)
{
     //this type is constructable with default constructor
}
else
{
   //no default constructor
}
于 2013-10-26T20:32:14.597 に答える
3

System.Runtime.Serialization.FormatterServices.GetUninitializedObject(type)を使用すると、オブジェクトがインスタンス化されますが、コンストラクターは呼び出されません。クラスのゼロ化されたインスタンスをレンダリングします。クラスにアクセスできる必要があります。アクセスできない場合、例外がスローされます。クラスに詳細な起動コードがある場合、これにより効率が向上する可能性があります。

于 2013-10-26T20:34:25.870 に答える