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

时间:2012-07-20 03:39:38

标签: c# inheritance azure-table-storage

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

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

谢谢! 安迪

6 个答案:

答案 0 :(得分:2)

您无法在运行时更改继承。

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

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

答案 1 :(得分:1)

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

就“使用属性存储的代码混乱”而言,部分类可以提供很多帮助:将与存储相关的属性放在一个单独的文件中,并且您的代码将再次看起来很干净。

答案 2 :(得分:1)

听起来简单地创建一个PersonTableServiceEntity类和一个静态方法来在Person实体和PersonTableServiceEntity

之间进行翻译会更简单

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

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

进一步更新 您可以使expando对象实现类似this的接口。