1

このオブジェクトのタイプが実行時まで不明な場合に、新しいオブジェクトを作成する際の最善のアプローチは何かについて、私は多少混乱しています。次の方法で Store という基本クラスがあるとします。

public class Store
{
   public Store()
   {
     Inventory = new List<Inventory>()
   }

   public string Title { get; set;} 
   public ICollection<Inventory> Inventory { get; set; }
}

クラスから継承する別のクラスがあるとしStoreます。それをペットストアと呼びましょう。StoreFactoryPetStore で、オブジェクトを作成するたびに呼び出されるコンストラクターを定義します。

ペットショップ

public PetStore(Store store) : base(store)
{
    Title = ((PetStore)store).Title;
}

とリフレクションを使用StoreFactoryしてオブジェクトをインスタンス化します。

public static Store FromTemplate(Store store)
{       
    Type type = Type.GetType(store.StoreType.ClassName);
    Store newstore = Activator.CreateInstance(type, store) as Store;
    return newstore;
}

今すぐ質問の核心に行きましょう。次のようにしてオブジェクトをインスタンス化する際の違いは何ですか:

Store newStore = StoreFactory.FromTemplate(existingPetStore);

dynamic newStore = StoreFactory.FromTemplate(existingPetStore);

質問を適切に表現しているかどうかはわかりません。少しわかりにくいかもしれませんが、その場合はご容赦ください。しかし、MVC がこれら 2 つをどのように区別し、最終的には、この場合に使用するのに最適なアプローチであるかを理解しようとしています。

4

2 に答える 2

2

ASP MVC はこの 2 つを区別しません。それを行うのは C# コンパイラです。からMSDN

動的型を使用すると、コンパイル時の型チェックをバイパスする操作が発生します。代わりに、これらの操作は実行時に解決されます。

...

ダイナミック型は、ほとんどの状況でオブジェクト型のように動作します。ただし、dynamic 型の式を含む操作は、コンパイラによって解決または型チェックされません。コンパイラは操作に関する情報をまとめてパッケージ化し、その情報は後で実行時に操作を評価するために使用されます。プロセスの一部として、dynamic 型の変数は object 型の変数にコンパイルされます。したがって、タイプ dynamic は、実行時ではなく、コンパイル時にのみ存在します。

基本的にこれが意味することは、次のようなことができるということです。

dynamic store = new Store();
store = 1;
store = "string";
store = new List<Store>();

ストアの例では機能しますが、同じタイプではない値を誤って割り当てる可能性があるため、エラーの可能性が高くなります。次に、それを使用すると、例外が発生します。問題に遭遇しやすくなるだけでなく、それは必要ありません。

基本クラスを使用して型をインスタンス化する方が適切なオプションです。

Store newStore = StoreFactory.FromTemplate(existingPetStore);

ただし、工場でリフレクションを使用している理由については混乱しています。私にはもったいないように思えます...new PetStore設定したいすべてのプロパティ セットを含む を返さないのはなぜですか? または、existingPetStore実行時に不明な場合は、オブジェクトを実装ICloneableして何かを実行してみませんMemberwiseCloneか? 反射は私の心の中で奇妙な選択のようです...

于 2013-09-12T00:53:12.040 に答える
1

それに対する1つの議論は、それを使用するときにコンパイル時の型の安全性がないということです。一部はコンパイル時エラーであり、代わりに実行時エラーとして現れます。

それに加えて、コードが共通言語ランタイムに加えて動的言語ランタイムで動作する必要があると思います。また、コードは実行時に多くのチェックを実行するため、パフォーマンスに悪影響を及ぼします。

DLR の詳細については、msdn のこの記事を参照してください。http://msdn.microsoft.com/en-us/library/dd233052.aspx

于 2013-09-12T17:05:10.470 に答える