有没有一种方法可以将函数调用添加到自动属性?

时间:2019-05-11 19:26:13

标签: c# properties

我了解Auto-Implemented Properties的工作方式以及应该如何提供帮助。我想知道我是否仍然可以以更高级的方式使用它。

想象一下我有这个:

public int SomeProperty { get; set; }

基本上,这是下面编写代码的另一种方式(但是使用自动属性)。

 private int _someField;
 public int SomeProperty 
 {
    get { return _someField;}
    set { _someField = value;}
 }

我要写的是:

 private int _someField;
 public int SomeProperty 
 {
    get { return _someField;}
    set { FunctionA(); _someField = value;}
 }

但是要利用Auto-Implemented Properties的优势。有可能吗?

我尝试过这样的事情: public int SomeProperty { get; set{FunctionA();} }

但是它不起作用。谢谢大家的帮助,我知道这很愚蠢,但对此感到很好奇。

2 个答案:

答案 0 :(得分:3)

否,这是不允许的。请参阅语言规范: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#properties

  

自动实现的属性(或简称为自动属性)是一种非抽象的非外部属性,具有仅分号的访问器主体。

答案 1 :(得分:0)

我没有找到免费工具,但是PostSharp处理了这个问题。它具有试用期和一些免费使用的选项。无论如何,请看一下方法修饰 AOP 框架。

using System;
using PostSharp.Aspects;

namespace ConsoleApp
{
    class Program
    {    
        static void Main(string[] args)
        {
            var someClass = new SomeClass();
            Console.WriteLine($"{nameof(someClass.Value)} = {someClass.Value}");
            someClass.Value = 42;
            Console.WriteLine($"{nameof(someClass.Value)} = {someClass.Value}");
        }
    }

    class SomeClass
    {
        public int Value { get; [Decorate] set; }

        private void SomeFunction()
        {
            Console.WriteLine("SomeFunction called");
        }

        [Serializable, AttributeUsage(AttributeTargets.Method)]
        public class DecorateAttribute : MethodInterceptionAspect
        {
            public override void OnInvoke(MethodInterceptionArgs args)
            {
                var target = (SomeClass)args.Instance;
                target.SomeFunction();

                args.Proceed(); // performs the method it applied to
            }
        }
    }
}

输出:

Value = 0
SomeFunction called
Value = 42