私はActivator.CreateInstance()
がobject
の新しいインスタンスを作成できることを知っています。しかし、私はIL
とExpression
でインスタンスを作成する方法を探しています。私は、型のインスタンスを作成するための動的ラムダを作成し、ラムダをキャッシュしてオブジェクトの初期化を高速化できると思います。私は正しい?私を助けてくれますか?ダイナミックラムダとILでオブジェクトの新しいインスタンスを作成する方法は?
答えて
Expression.New()
を使用してオブジェクトの作成を表すことができます。パラメータのないコンストラクタを持つType
、またはコンストラクタパラメータを表すExpression
と一緒にConstructorInfo
を渡すことができます。 object
を返したい場合は、値タイプに対しても機能させたい場合は、Expression.Convert()
も追加する必要があります。一緒にすべてを置く
、Activator.CreateInstance()
と同等のは次のようになります。
object CreateInstance(Type type)
{
return Expression.Lambda<Func<object>>(
Expression.Convert(Expression.New(type), typeof(object)))
.Compile()();
}
あなたはILで同じことをしたい場合は、参照型のためthe newobj
instructionを使用する必要があります。あなたが値タイプに対して同じことを行いたい場合、あなたはそれを、その型のローカル変数を作成し、それをボックスと返すことができます。
object CreateInstance(Type type)
{
var method = new DynamicMethod("", typeof(object), Type.EmptyTypes);
var il = method.GetILGenerator();
if (type.IsValueType)
{
var local = il.DeclareLocal(type);
// method.InitLocals == true, so we don't have to use initobj here
il.Emit(OpCodes.Ldloc, local);
il.Emit(OpCodes.Box, type);
il.Emit(OpCodes.Ret);
}
else
{
var ctor = type.GetConstructor(Type.EmptyTypes);
il.Emit(OpCodes.Newobj, ctor);
il.Emit(OpCodes.Ret);
}
return method.Invoke(null, null);
}
ありがとう、私はそれを理解しています。したがって、コントラクタにいくつかの議論がある場合、どのようにテーマを提供できますか?もう1つのQは、「表現」についてはどこで知ることができるのですか?どこでそれを学びましたか?事前にお礼します –
さまざまな.Netタイプについて知る必要があるものは[MSDN](http://msdn.microsoft.com/en-us/library/gg145045.aspx)([式]のドキュメントを含む) (http://msdn.microsoft.com/en-us/library/bb356138.aspx)。そして私が言ったように、おそらく 'Expression.Constant()'を使って 'New()'メソッドへのパラメータとしてコンストラクタにパラメータを渡すことができます。 – svick
- 1. JavaScriptのオブジェクトの新しいインスタンスを作成する方法
- 2. Firebaseで新しいDatabaseErrorインスタンスを作成する方法は?
- 3. リポジトリパターンを使用してオブジェクトの新しいインスタンスを作成する正しい方法は何ですか?
- 4. Mappableインターフェイスを実装するオブジェクトの新しいインスタンスを作成
- 5. StructureMapでオブジェクトのインスタンスを動的に作成する方法は?
- 6. 新しいインスタンスを作成するときにObjectのデフォルトメソッドを隠す方法
- 7. JNIで新しいスコープで新しいJavaオブジェクトを作成する方法
- 8. QMLでQ_GADGET構造体の新しいインスタンスを作成する方法は?
- 9. ラストでラップされたベクトルの新しいインスタンスを作成する方法は?
- 10. Rediskaを使用してリストの新しいインスタンスを作成する方法は?
- 11. オブジェクトの新しいインスタンスでいっぱいのリストを作成する
- 12. 新しいインスタンスを作成せずにxmlでオブジェクトを編集
- 13. オブジェクトのインスタンスを作成する方法は?
- 14. 角2 AOTコンパイルエラー - ルートを作成するときの新しいオブジェクトのインスタンス
- 15. 変数に基づいてオブジェクトの新しいインスタンスを作成
- 16. Cでオブジェクトのインスタンスを作成する方法#
- 17. PSObjectオブジェクトの新しいクローンインスタンスを作成する方法
- 18. Python - なぜオブジェクトの新しいインスタンスを作成しないのですか?
- 19. 私はAnonymousTypeインスタンスを作成しようとしている新しいAnonymousTypeインスタンス
- 20. JavaScript - オブジェクトの新しいインスタンスを動的に作成する方法はありますか?
- 21. Cで構造体の新しいインスタンスを作成する方法
- 22. djangoで新しいモデルとフィールドを作成する方法は?
- 23. Pythonでオブジェクトを再作成/再インスタンス化する方法2.7
- 24. for-eachまたはasp.net mvcで使用する方がよい新しいオブジェクト(インスタンス)を作成しますか?
- 25. Typescriptで型の新しいインスタンスを作成するには?
- 26. 値がtrueの場合は、オブジェクトの新しいインスタンスを作成します。
- 27. Rails:ActiveRecordの作成方法と新しい方法の違いは?
- 28. 既存のラムダ式からダイナミックラムダを作成する
- 29. Dockerは新しいイメージとインスタンスを作成します
- 30. 新しいITLibMediaItemオブジェクトの作成方法は?
重複http://stackoverflow.com/questions/9788813/best-way-実行時に決定されるタイプのインスタンス作成/ 9789971#9789971 –