28


7

私はこの話題についてオンラインで少し読んだことがありますが、私には役に立たないものはありません。 私がやろうとしているのは、ランタイム型のクラスを作成することです。

私は `Activator.CreateInstance`を使用しています。これは引数を含まないコンストラクタを持つクラスに対してうまく働きます。 引数がある人には例外を投げますが、これを回避する方法はありますか?

クラス自体を作成できるのであれば、null値または空の値をctorに渡すことができてうれしいです。

5 Answer


47


引数を `params object []`として受け入れるオーバーロードがあります:

オブジェクトobj = Activator.CreateInstance(typeof(StringBuilder)、 "abc");

これでしょうか。 あるいは、リフレクションを使って正しいコンストラクタを見つけることができます。

Type [] argTypes = new Type [] {typeof(string)}; object [] argValues = new object [] {"abc"}; ConstructorInfo ctor = typeof(StringBuilder).GetConstructor(argTypes);オブジェクトobj = ctor.Invoke(argValues);


8


私は結局このようなことをすることになった - とにかくコメント者の何人かはこの解決策に向かってほのめかした。

私は基本的にすべての利用可能なコンストラクタを反復処理し、最も単純なものを選びました。 私はそれからctorに渡すためにnullデータを作成しました。

コードの一部はこのように少し見えます

// If we have a ctor that requires parameters then pass null values
if(requireParameters){リストパラメータ= new List(); ParameterInfo [] pInfos = constructorInfos [0] .GetParameters();

foreach(ParameterInfo pi in pInfos){parameters.Add(createType(pi.ParameterType)); }

コンストラクタを返す[0] .Invoke(parameters.ToArray()); }


1


私は 私が遭遇した問題を回避するためにこの方法を使用しています、そしてそれはまさに同じように働いているようです私は望みました。 :)

オブジェクトインスタンス= Activator.CreateInstance(typeof(OpCode)、BindingFlags.NonPublic | BindingFlags.Instance、デフォルト(Binder)、新しいオブジェクト[]デフォルト(CultureInfo));


0


Activator.CreateInstanceにも、たくさんのオーバーロードがあります。チェックアウトしたいのは、(Type type、params object [] args)です。 この呼び出しの2番目のパラメーターに必要なコンストラクター引数を渡すだけです。

ただし、ここで例外を処理することを忘れないでください。間違ったパラメーターを渡したり、後で型のコンストラクターに変更を加えることで破損することがあります。


0


Activator.CreateInstanceの代わりとして、リンクされたURLのFastObjectFactoryはActivatorよりも優れたプリフォームを提供します(.NET 4.0以降、.NET 3.5よりもはるかに優れています)。 .NET 4.5ではテストや統計は行われていません。 統計、情報およびコードについてはStackOverflowの投稿を参照してください。 コントロールパラメータの数に基づいていくつかの変更を行う必要があるかもしれないことに注意してください。 提供されているコードは1つのコントロールパラメータしか許可していませんが、複数になるように変更することができます。 コード内のコメントを参照してください。

https://stackoverflow.com/questions/2024435/how-to-pass-ctor-args-in-activator-createinstance[Activator.CreateInstanceで引数を渡すには、どうしたらいいですか。]