我了解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();} }
但是它不起作用。谢谢大家的帮助,我知道这很愚蠢,但对此感到很好奇。
答案 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