Есть ли способ добавить вызовы функций в автоматическое свойство? - PullRequest
2 голосов
/ 11 мая 2019

Я понимаю, как 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 ]

3 голосов
/ 11 мая 2019

Нет, это не разрешено.См. Спецификацию языка: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#properties

Автоматически реализованное свойство (или сокращенное авто-свойство) - это неабстрактное неэкстерьерное свойство с телами доступа, состоящими только из точек с запятой.

1 голос
/ 12 мая 2019

Я не нашел бесплатный инструмент, но 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...