2

ファクトリパターンスタイルの関数で次のコード(のわずかに拡張されたバージョン)を使用しています:

public class SingleItemNew : CheckoutContext { public BookingContext Data { get; set; } public SingleItemNew(BookingContext data) { Data = data; } } public CheckoutContext findContext(BookingContext data) { Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString()); CheckoutContext output = Activator.CreateInstance(contextType, BindingFlags.CreateInstance, new[] { data }) as CheckoutContext; return output; }

ただし、実行時にconstuctor not found例外がスローされるため、理由がわかりません。

data.Case.ToString()メソッドは、単一の引数を取るコンストラクターを持つクラスの名前SingleItemNewを返します。

誰かが問題が何であるかを知っていますか?

乾杯、エド

4

4 に答える 4

7

これを試してください:

  Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString());
  CheckoutContext output = 
      (CheckoutContext)Activator.CreateInstance(contextType, data);

コードが機能しない理由はActivator.CreateInstance、必要なオーバーロードが実際にはないためです。したがって、なぜコードがコンパイルされるのか不思議に思うかもしれません。その理由は、(Type type, params object[] args)メソッド呼び出しに一致するオーバーロードがあるため、コンパイルされますが、実行時に、型が持っているものとは明らかに異なるaBindingFlagsとaをとるコンストラクターを型で検索します。BookingContext[]

于 2009-06-11T16:19:25.240 に答える
1

コンストラクターは公開されていますか?

タイプの単一のパラメーターはありBookingContextますか?

問題は、これは明らかに大きなシステムの一部であるということです。問題を実証する短いが完全なプログラムを作成できれば、はるかに簡単に支援できます。次に、そのプログラムの問題を修正し、修正を実際のシステムに移植することができます。そうでなければ、私たちは本当に推測しているだけです:(

于 2009-06-11T16:19:00.360 に答える
0

SingleItemNewコンストラクターはBookingContextをパラメーターとして受け取りますか?完全に一致しない場合は失敗します。

class ParamType   {    }
class DerivedParamType : ParamType    {    }
class TypeToCreate
{
    public TypeToCreate(DerivedParamType data)
    {
        // do something
    }
}

ParamType args = new ParamType();
// this call will fail: "constructor not found"
object obj = Activator.CreateInstance(typeof(TypeToCreate), new object[] { args });

// this call would work, since the input type matches the constructor
DerivedParamType args = new DerivedParamType();
object obj = Activator.CreateInstance(typeof(TypeToCreate), new object[] { args });
于 2009-06-11T16:24:47.037 に答える
0

これは私のために働いた。

Type.GetType( "namespace.class、namespace");

于 2009-09-08T17:55:05.110 に答える