我可以让我的类在运行时inheritance自另一个类吗?

我有一个类(人),它是我的MVVM应用程序中的模型。 我想将此类保存到Azure表存储。 要保存到Azure表存储,您需要从名为TableServiceEntity的类派生。 我宁愿不要将我的优秀课程与用于存储的属性混为一谈(考虑分离关注点似乎是一个好主意)。

我可以以某种方式让我的类在运行时派生自TableServiceEntity,在接收对象作为参数的方法中并将其持久存储到存储中吗? 这样可以让我的class级保持清洁存储属性,但仍然让我将它保存到表存储。

谢谢! 安迪

您可以使用DynamicObject或Castle Proxy模拟类似的东西。 您可以使用其中一种技术创建AzureEntity,而不是将Person保存为azure,并生成一个与Person具有相同属性的对象,但它inheritance自TableServiceEntity。

TableServiceEntity的事情,只是为了易于使用…你可以得到你的存储客户端库源代码(据我记得在git hub或codeplex周围发布),并修改它工作而不使用TableServiceEntity的事情。

评论更新:在您的情况下,您可以使用两者……不同之处在于,在expando对象中,您可以通过扩展来定义对象,而动态对象则通过理解来定义。 动态对象更强大(更复杂),但在这种情况下你不需要任何动态对象。 BTW:Castle Proxy非常类似于动态对象方法,但它在运行时生成了大量代码,因此它可能会比动态对象或expando对象获得更好的性能。

进一步更新:您可以使expando对象实现这样的接口。

您无法在运行时更改inheritance。

您可以使用AutoMapper等工具从域对象映射到从TableServiceEntity派生的数据存储对象。

O / R Mappers(如Entity Framework Code First或NHibernate)的一个好处是它们不会强制您从特殊的基类派生。

不幸的是,没有:C#中的inheritance是一个编译时的概念,所以你的对象必须在编译时从它的基类inheritance。

对于“用存储的属性混淆你的代码”来说,部分类可以提供很多帮助:将与存储相关的属性放在一个单独的文件中,你的代码将再次看起来干净。

听起来简单地创建一个PersonTableServiceEntity类和一个静态方法来在Person实体和PersonTableServiceEntity之间进行转换会更简单

简短回答 – 不。 这一切都是在c#的编译时完成的。 Srry

如果可能的话,根本不知道,但这并不会让我感到害怕。 只需创建一个PersonStorage类来使用单个Person实例inheritanceTableServiceEntity?