活性化剤です。CreateInstance t,42,(<%=args%>等:args)なコンストラクタ
-
13-09-2019 - |
質問
私を使用し、若干の拡張版)を以下のコード工場でのパターンのスタイル機能:
公共のクラスSingleItemNew:CheckoutContext
{
公BookingContextデータ{get;セット}
公SingleItemNew(BookingContextデータ)
{
データ=データ}
}
公CheckoutContext findContext(BookingContextデータ)
{
タイプcontextType=タイプです。GetType("CheckoutProcesses." +データです。ます。ToString());CheckoutContext出力=
活性化剤です。CreateInstance(contextType,BindingFlags.CreateInstance、[]{data})としてCheckoutContext;返却出力}
しかし、捨てconstuctor見つからない場合に送出される例外で走行させることができませんの姿はいかがでしょうか。
のデータです。ます。ToString()メソッドの名前を返しますにチェックSingleItemNewるコンストラクタを単一の引数に使います。
はもう何が問題なのか?
乾杯編
解決
この方法を試してください。
Type contextType = Type.GetType("CheckoutProcesses." + data.Case.ToString());
CheckoutContext output =
(CheckoutContext)Activator.CreateInstance(contextType, data);
あなたは、コードが動作しない理由はActivator.CreateInstance
が本当にしたいの過負荷を持っていないということです。コードがすべてでコンパイルだから、なぜあなたは不思議に思うかもしれません!その理由は、それがなく、実行時にコンパイルされますので、あなたのメソッドの呼び出しに一致する(Type type, params object[] args)
を受け取るオーバーロードがあり、である、それはBindingFlags
とあなたのタイプを持っているものを明確ではありませんBookingContext[]
を取るコンストラクタのためのあなたのタイプを検索します。
他のヒント
のコンストラクタをいつですか?
は単一のパラメータの型 BookingContext
?
の問題は、すでに一部の大きなシステムで 多く すきまを作り出すことのできる、 短いものの完全にプログラム 性の問題です。そしてこの問題はそのプログラムとして始めたから新築した港の修正おリます。Otherwisewiseいうことにな推測:(
SingleItemNewコンストラクタは、パラメータとしてBookingContextを取るのか?それはexatcly一致しない場合、それは失敗します:
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 });
これは私のために働いています。
Type.GetType( "namespace.class、名前空間");