Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以让我的类在运行时从另一个类继承吗?_C#_Inheritance_Azure Table Storage - Fatal编程技术网

C# 我可以让我的类在运行时从另一个类继承吗?

C# 我可以让我的类在运行时从另一个类继承吗?,c#,inheritance,azure-table-storage,C#,Inheritance,Azure Table Storage,我有一个类(person),它是我的MVVM应用程序中的一个模型。我想将此类保存到Azure表存储。要保存到Azure表存储,您需要从名为TableServiceEntity的类派生。我不希望用存储属性来扰乱我的好类(考虑关注点分离似乎是个好主意) 我是否可以让我的类在运行时从TableServiceEntity派生,在将对象作为参数接收并将其持久化到存储器的方法中?这将使我的类保持干净的存储属性,但仍然让我保存到表存储 谢谢! Andy不幸的是,否:C#中的继承是一个编译时概念,因此您的对象必

我有一个类(person),它是我的MVVM应用程序中的一个模型。我想将此类保存到Azure表存储。要保存到Azure表存储,您需要从名为TableServiceEntity的类派生。我不希望用存储属性来扰乱我的好类(考虑关注点分离似乎是个好主意)

我是否可以让我的类在运行时从TableServiceEntity派生,在将对象作为参数接收并将其持久化到存储器的方法中?这将使我的类保持干净的存储属性,但仍然让我保存到表存储

谢谢!
Andy

不幸的是,否:C#中的继承是一个编译时概念,因此您的对象必须在编译时从其基类继承


至于“用存储属性将代码弄得乱七八糟”的问题,部分类可能会有很大帮助:将与存储相关的属性放在一个单独的文件中,您的代码将再次看起来干净。

听起来,创建一个
PersonTableServiceEntity
类和一个静态方法在
Person
实体和
PersonTableServiceEntity
实体之间进行转换会更简单。您不能在运行时更改继承

您可以使用以下工具将域对象映射到从TableServiceEntity派生的数据存储对象,如


像Entity Framework Code First或NHibernate这样的O/R映射程序的一个好处是,它们不会强迫您从特殊的基类派生。

简短的回答是——不。所有这些都是在c#编译时完成的。sry

完全不知道这是否可能,但我觉得可能性不大。
只需创建一个PersonStorage类来继承具有单个Person实例的TableServiceEntity?

您可以使用DynamicObject或。不必将Person保存到azure,您可以使用这些技术之一创建AzureEntity,并生成一个对象,该对象具有与Person相同的属性,但它继承自TableServiceEntity

TableServiceEntity只是为了方便使用而做的。。。您可以获得存储客户机库源代码(据我所知,它是在git hub或codeplex附近发布的),并对其进行修改,使其能够工作,而无需使用TableService实体

更新评论: 在您的情况下,您可以同时使用。。。不同之处在于,在expando对象中,通过扩展定义对象,而动态对象通过理解定义。动态对象功能更强大(也更复杂),但在这种情况下,您不需要这些。 顺便说一句:Castle代理与动态对象方法非常相似,但它在运行时生成大量代码,因此它可能比动态对象或expando对象获得更好的性能

进一步更新:
您可以让expando对象实现像。

这样的接口,您可以深入了解
System.Reflection.Emit
,但我认为在运行时创建新类型可能不是最好的方法。我也不建议使用反射。它大大降低了应用程序的性能wise@Amit不是反射,而是代码发射。此命名空间包含可用于在运行时动态创建新类型的类型。您可以发出IL来创建方法,然后像任何其他类型一样对这些方法进行JIT编译。一旦你用这个API创建了一个类型,它将执行与C#编译器编译的完全相同的操作。@cdhowie,是的,我指的是名称空间,我的坏蛋应该已经弄清楚了。谢谢你的回答,伙计们,但我只是想探究一下,DLR中是否有任何东西,比如expando对象,这样我就可以在保存类时向该类添加必要的属性了吗?或者我可以将expando对象作为持久化到存储的方法中的参数,并让expando对象继承TableServiceEntity类吗?DLR在这一点上对我来说是一个模糊的概念,但我一直在研究它,因为这个原因。@AndrewBSchultz您不能同时继承expando对象和表服务实体,但您可以实现expando对象实现的
IDynamicMetaObjectProvider
接口,并将调用转发到嵌入式expando对象。不过,与编译时继承相比,这几乎不是一个改进。我只是问dasblinkenlight关于使用Expando对象的问题——我对DLR不是很熟悉,但我认为可能有什么问题。所以你认为我应该更关注DynamicObject而不是Expando对象吗?那太完美了——除了我认为我被这样一个事实绊倒了:你不仅需要从TableServiceEntity继承的属性来保存到Azure表,你的类还需要用这个属性来修饰:[DataServiceKey(“PartitionKey”,“RowKey”)]。没有办法给expando对象赋予属性,是吗?太好了,谢谢!那很有帮助。