C# 使用';动态';实例化对象时vs基类型

C# 使用';动态';实例化对象时vs基类型,c#,asp.net-mvc,asp.net-mvc-4,factory,C#,Asp.net Mvc,Asp.net Mvc 4,Factory,我有点困惑,当在运行时之前对象的类型未知时,创建新对象的最佳方法是什么。假设我有一个名为Store的基类,其方式如下: public class Store { public Store() { Inventory = new List<Inventory>() } public string Title { get; set;} public ICollection<Inventory> Inventory { get; se

我有点困惑,当在运行时之前对象的类型未知时,创建新对象的最佳方法是什么。假设我有一个名为Store的基类,其方式如下:

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

   public string Title { get; set;} 
   public ICollection<Inventory> Inventory { get; set; }
}
使用
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);


我不确定这个问题的措辞是否恰当。这可能有点混乱,如果是这样的话,我道歉。但是,我希望了解MVC如何区分这两种语言,并最终了解在这种情况下使用哪种语言是最好的方法。

ASP MVC不会区分这两种语言,而是C编译器。从

动态类型使发生动态类型的操作能够绕过编译时类型检查。相反,这些操作是在运行时解决的

在大多数情况下,类型动态的行为与类型对象类似。但是,编译器不会解析或检查包含dynamic类型表达式的操作。编译器将有关操作的信息打包在一起,这些信息稍后用于在运行时评估操作。作为过程的一部分,dynamic类型的变量被编译成object类型的变量。因此,类型dynamic只在编译时存在,而不在运行时存在

基本上这意味着你可以做这样的事情:

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

不过,我很困惑,为什么你们要在你们的工厂里使用反射。对我来说这似乎是浪费。。。为什么不返回一个
新的PetStore
,并设置您想要设置的所有属性?或者,如果运行时不知道
existingPetStore
,为什么不让对象实现
ICloneable
并执行
MemberwiseClone
或其他操作?在我看来,反射似乎是一个奇怪的选择…

反对它的一个论点是,在使用它时没有编译时类型安全性。有些可能是编译时错误,但会显示为运行时错误

除此之外,我认为除了公共语言运行库之外,还需要您的代码使用动态语言运行库。您的代码还将在运行时执行许多检查,这将对性能产生负面影响


要了解更多关于DLR的信息,请查看msdn上的这篇文章

我相信有一些相当显著的区别。我不建议在这里使用
dynamic
。虽然我相信像Eric Lippert或Jon Skeet这样的人可以给你提供一个彻底的答案,但我必须查看文档以提供具体的差异。我感谢你的输入:)对不起,这没有多大用处。反对它的一个理由是,当您使用它时,您没有编译时类型安全性。有些可能是编译时错误,但会显示为运行时错误。除此之外,我认为除了公共语言运行时之外,还需要您的代码使用动态语言运行时,并在运行时执行许多检查,这将对性能产生负面影响。也许我应该把它作为一个答案?仔细阅读。它绝对增加了引用,可能相当多。
dynamic
和DLR,正如你在那篇文章中看到的,主要是为了互操作性而添加的,并且(至少微软说:p)通过卸载大量的锅炉板工作来支持语言设计者。这很有趣,也是一个非常彻底的响应!也许比我想象的要简单一点。非常感谢。作为对克隆vs工厂的回应…为什么实现接口比工厂更好?我是MVC的新手(你可能会知道)。工厂看起来更有意义的唯一原因是,我不需要元素的完整副本,只需要一些属性(如本例中的“Title”)。
dynamic newStore = StoreFactory.FromTemplate(existingPetStore);
dynamic store = new Store();
store = 1;
store = "string";
store = new List<Store>();
Store newStore = StoreFactory.FromTemplate(existingPetStore);