如何覆盖部分类属性

时间:2013-03-04 17:43:12

标签: c# asp.net-mvc-4 entity-framework-5

我有一个部分课程,我想做类似以下的事情:

[MetadataType(typeof(UserMetaData))]
public partial class Person
{
    public override string PrivateData
    {
        get
        {
            return customDecrypt(base.PrivateData);
        }
        set
        {
            base.PrivateData = customEncrypt(value);
        }
    }
}

但上述方法无效。

有没有办法覆盖基本实体框架类的属性以允许自定义getter / setter?

3 个答案:

答案 0 :(得分:23)

部分类与继承无关,而override完全与继承有关。

类上的partial关键字意味着它可以在同一个程序集中多次声明。这与将每个partial class的每个部分复制到同一文件并删除partial关键字完全相同。由于您无法在同一个类中两次定义相同的属性/函数/ etc,因此即使使用partial关键字,也无法在同一个类的两个独立部分中定义它两次。

另一方面,

override派生的类中用于表示它们正在替换它们继承的基类的功能。如果它没有显式继承,则它继承自object,允许您覆盖ToString()(以及其他)。

执行所需操作的最佳选择是使用自定义T4模板生成加密/解密逻辑,或者在设计器中将加密属性设置为protectedprivate并手动设置添加进行解密的public版本。

答案 1 :(得分:2)

如果您可以更改代码生成器,则可以轻松地模拟"它("覆盖"默认值)使用extrimely强大的部分方法

https://msdn.microsoft.com/en-us/library/wa80x488.aspx

答案 2 :(得分:0)

虽然您不能覆盖Entity Framework基类,但是有一种解决方法。在.edmx模型中(首先对于DB,如果代码优先,则直接在实体中),要“覆盖”属性,将Getter / Setter更改为private并重命名该属性。然后使用公共名称(该属性将不再冲突)使用属性创建部分类。

如果需要,您可以在公共部分类属性中访问重命名的私有属性。