C# 属性修改:绕过直接传递引用
C# 不直接支持通过引用传递属性。 此限制可能会使外部修改属性的尝试变得复杂,从而导致意外结果。
了解编译时问题
下面的代码说明了这个问题:
<code class="language-csharp">public void GetString(string inValue, ref string outValue) { // code } public void SetWorkPhone(string inputString) { GetString(inputString, ref this.WorkPhone); // Compile-time error }</code>
这会失败,因为属性不是引用类型;它们是管理底层私有字段的方法。
修改属性的替代方法
虽然直接引用传递是不可能的,但有几种技术可以达到类似的结果:
<code class="language-csharp">public string GetString(string inputString) { return string.IsNullOrEmpty(inputString) ? this.WorkPhone : inputString; }</code>
<code class="language-csharp">public void GetString(string inputString, Action<string> updateWorkPhone) { if (!string.IsNullOrEmpty(inputString)) { updateWorkPhone(inputString); } }</code>
<code class="language-csharp">public void GetString<T>(string inputString, T target, Expression<Func<T, string>> outExpr) { if (!string.IsNullOrEmpty(inputString)) { var prop = (outExpr.Body as MemberExpression).Member as PropertyInfo; prop.SetValue(target, inputString); } }</code>
<code class="language-csharp">public void GetString(string inputString, object target, string propertyName) { if (!string.IsNullOrEmpty(inputString)) { var prop = target.GetType().GetProperty(propertyName); prop.SetValue(target, inputString); } }</code>
这些方法有效地规避了直接传递引用的限制,提供了间接修改 C# 属性的受控且安全的方法。
以上是不支持直接引用传递时如何有效修改C#属性?的详细内容。更多信息请关注PHP中文网其他相关文章!