C# 从属性的getter调用方法

C# 从属性的getter调用方法,c#,reflection,attributes,C#,Reflection,Attributes,当调用类中任何属性的getter时,是否有一种方法可以定义一个方法,在任何情况下都会调用该方法 该类是一个基类,我想实现它的各种子类,但每个子类都应该有一个共同点,即无论其getter函数应该访问哪个属性,都应该在返回属性之前执行一个操作。不,除非您将其编码到每个getter中,或者放弃“普通的旧C#类”总的来说,构建一个基于读审核数据集的数据模型范例。如果你沿着这条路线走下去,你只需要让每个“数据类”成为Get/Set委托的字典,并通过这些委托访问它的数据值。这不是一个罕见的设计,但它不再遵循

当调用类中任何属性的getter时,是否有一种方法可以定义一个方法,在任何情况下都会调用该方法


该类是一个基类,我想实现它的各种子类,但每个子类都应该有一个共同点,即无论其getter函数应该访问哪个属性,都应该在返回属性之前执行一个操作。

不,除非您将其编码到每个getter中,或者放弃“普通的旧C#类”总的来说,构建一个基于读审核数据集的数据模型范例。如果你沿着这条路线走下去,你只需要让每个“数据类”成为Get/Set委托的字典,并通过这些委托访问它的数据值。这不是一个罕见的设计,但它不再遵循OO范式

示例(psuedo代码)

公共类MonitoredCustomerObject
{
//假设Get/Set委托存储在一个简单的元组中。
私有字典getterSetterDict=new。。。
公共GetValue(字符串键)
{
executeMyOnReadCode();
返回getterSetterDict[key].Item1();
}
公共设置值(字符串键)
{
executeMyOnWriteCode();
GetterSettings[key].Item2();
}
}

不,除非您将其编码到每一个Getter中,或者您完全放弃“普通的旧C#类”,并基于一组经过读取审核的数据构建一个数据模型范例。如果你沿着这条路线走下去,你只需要让每个“数据类”成为Get/Set委托的字典,并通过这些委托访问它的数据值。这不是一个罕见的设计,但它不再遵循OO范式

示例(psuedo代码)

公共类MonitoredCustomerObject
{
//假设Get/Set委托存储在一个简单的元组中。
私有字典getterSetterDict=new。。。
公共GetValue(字符串键)
{
executeMyOnReadCode();
返回getterSetterDict[key].Item1();
}
公共设置值(字符串键)
{
executeMyOnWriteCode();
GetterSettings[key].Item2();
}
}

您可以假装这样做,也可以编写一个Fody扩展来实现这一点。例如,可以将基类定义为:

public abstract class MyBaseClass
{
    public object MyProperty
    {
        get
        {
            RunSomeMethod();
            return MyPropertyValue;    
        }
    }
    protected abstract object MyPropertyValue { get; }
}
哪种“类型”迫使实现者这样编写:

public class MyDerivedClass : MyBaseClass 
{
    protected override object MyPropertyValue
    {
        get
        {
            return SomeObjectValue();
        }
    }
}

派生类仍然可以使用
new
隐藏基类属性,但至少这会使开发人员明确意识到他们在做一些非预期的事情。

您可以假装这样做,或者编写一个Fody扩展来实现这一点。例如,可以将基类定义为:

public abstract class MyBaseClass
{
    public object MyProperty
    {
        get
        {
            RunSomeMethod();
            return MyPropertyValue;    
        }
    }
    protected abstract object MyPropertyValue { get; }
}
哪种“类型”迫使实现者这样编写:

public class MyDerivedClass : MyBaseClass 
{
    protected override object MyPropertyValue
    {
        get
        {
            return SomeObjectValue();
        }
    }
}

派生类仍然可以使用
new
隐藏基类属性,但至少这会使开发人员明确意识到他们在做一些非预期的事情。

这很有帮助:)也许我宁愿坚持OO原则,直到找不到其他解决方案,我尝试将调用减少到基本需要时,或者手动实现它们。但很高兴看到还有另一种并不少见的方法。@fruitx这就是.net framework Expando对象是如何“在后台”实现的。由于这种设计允许您在运行时删除“字段”并将其添加到“类”中,因此它弥补了松散类型语言与允许继承删除和运行时动态类的更“高级”OO实现之间的差距。这是一个值得考虑的问题,但不应该仓促进行,你需要在PoCO的好处和这种数据字典驱动的业务对象模型之间找到一个很好的平衡点。这有很大的帮助:也许我宁愿坚持OO原则,直到没有其他的解决方案。我尝试将调用减少到基本需要时,或者手动实现它们。但很高兴看到还有另一种并不少见的方法。@fruitx这就是.net framework Expando对象是如何“在后台”实现的。由于这种设计允许您在运行时删除“字段”并将其添加到“类”中,因此它弥补了松散类型语言与允许继承删除和运行时动态类的更“高级”OO实现之间的差距。这是一个值得考虑的问题,但不应该仓促进行——你需要一个非常好的平衡PoCO的好处和这种数据字典驱动的业务对象模型之间的平衡,这也是值得一试的。我的意图是在不知道数据对象中包含什么的情况下使用数据对象,因此字典方法可能更适合。但谢谢你的见解。这也值得一试!我的意图是在不知道数据对象中包含什么的情况下使用数据对象,因此字典方法可能更适合。但谢谢你的见解。