如何在C#自动属性的setter中添加自定义函数调用逻辑?
解决方案
首先明确:C#原生自动属性无法直接在setter中插入自定义逻辑(你期望的public int MyProperty {get; set {MyFunction();}; }不符合语法规范,无法编译),但可以通过以下几种方式减少重复代码的编写量:
1. 自定义Visual Studio代码片段
创建一个代码片段模板,输入快捷键就能快速生成带setter回调的属性,避免手动重复编写:
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>带回调的属性模板</Title> <Shortcut>propw</Shortcut> <Description>生成包含setter回调逻辑的属性</Description> </Header> <Snippet> <Declarations> <Literal> <ID>type</ID> <ToolTip>属性类型</ToolTip> <Default>int</Default> </Literal> <Literal> <ID>propertyName</ID> <ToolTip>属性名称</ToolTip> <Default>MyProperty</Default> </Literal> <Literal> <ID>fieldName</ID> <ToolTip>私有字段名称</ToolTip> <Default>_myProperty</Default> </Literal> </Declarations> <Code Language="csharp"><![CDATA[private $type$ $fieldName$; public $type$ $propertyName$ { get { return $fieldName$; } set { $fieldName$ = value; MyFunction(); } }]]></Code> </Snippet> </CodeSnippet> </CodeSnippets>
将文件保存为.snippet格式后导入VS,输入propw按Tab即可快速生成目标属性。
2. T4模板批量生成属性
如果属性数量极多,编写T4模板可以批量生成所有带回调逻辑的属性:
<#@ template language="C#" #> <#@ output extension=".cs" #> public class YourClass { <# // 维护需要生成的属性列表 var properties = new[] { new { Type = "int", Name = "Age" }, new { Type = "string", Name = "Name" }, new { Type = "bool", Name = "IsActive" } }; foreach (var prop in properties) { #> private <#= prop.Type #> _<#= prop.Name.ToLower() #>; public <#= prop.Type #> <#= prop.Name #> { get { return _<#= prop.Name.ToLower() #>; } set { _<#= prop.Name.ToLower() #> = value; MyFunction(); } } <# } #> private void MyFunction() { // 你的回调逻辑实现 } }
运行模板后会自动生成所有属性,后续只需维护properties数组即可。
3. AOP框架实现横切逻辑(如PostSharp)
如果项目允许引入第三方库,可通过AOP框架将回调逻辑抽离为横切关注点,无需手动编写每个setter:
[Serializable] public class SetterCallbackAttribute : OnMethodBoundaryAspect { public override void OnSuccess(MethodExecutionArgs args) { var target = args.Instance as YourClass; target?.MyFunction(); } } public class YourClass { [SetterCallback] public int Age { get; set; } [SetterCallback] public string Name { get; set; } public void MyFunction() { // 你的回调逻辑实现 } }
所有标记[SetterCallback]的自动属性,在setter执行后都会自动触发MyFunction。
内容的提问来源于stack exchange,提问作者teriyakiforandy
相关产品推荐
相关产品推荐

