在 C# 中透過引用傳遞屬性
在 C# 中透過引用傳遞屬性並非易事,因為屬性不會公開其支援欄位的參考。但是,有一些方法可以實現類似的行為。
1. 回傳值:
此方法傳回輸入值(如果它不是 null 或空),否則傳回原始屬性值。
<code class="language-csharp">string GetString(string input, string output) { if (!string.IsNullOrEmpty(input)) { return input; } return output; } void Main() { var person = new Person(); person.Name = GetString("test", person.Name); Debug.Assert(person.Name == "test"); }</code>
2. 委託:
使用委託,可以透過委託操作將輸入值賦給屬性。
<code class="language-csharp">void SetStringValue(string input, Action<string> setOutput) { if (!string.IsNullOrEmpty(input)) { setOutput(input); } } void Main() { var person = new Person(); SetStringValue("test", value => person.Name = value); Debug.Assert(person.Name == "test"); }</code>
3. LINQ 表達式:
此方法利用 LINQ 表達式來檢索屬性的支援欄位並賦值輸入值。 (此方法的程式碼範例在原文中存在語法錯誤,無法直接運作。以下提供一個修正後的範例,但可能需要根據實際情況調整。)
<code class="language-csharp">void SetStringProperty<T, TProperty>(string input, T target, Expression<Func<T, TProperty>> propertyExpression) { if (!string.IsNullOrEmpty(input)) { var memberExpression = (MemberExpression)propertyExpression.Body; var propertyInfo = (PropertyInfo)memberExpression.Member; propertyInfo.SetValue(target, Convert.ChangeType(input, propertyInfo.PropertyType)); } } void Main() { var person = new Person(); SetStringProperty("test", person, x => x.Name); Debug.Assert(person.Name == "test"); }</code>
4. 反射:
反射可用於存取屬性的基礎欄位並賦值輸入值。
<code class="language-csharp">void SetPropertyValue(string input, object target, string propertyName) { if (!string.IsNullOrEmpty(input)) { var prop = target.GetType().GetProperty(propertyName); prop.SetValue(target, input); } } void Main() { var person = new Person(); SetPropertyValue("test", person, nameof(Person.Name)); Debug.Assert(person.Name == "test"); }</code>
要注意的是,使用反射和LINQ表達式的方法雖然能達到目的,但效率相對較低,且程式碼的可讀性和可維護性也可能降低。 建議優先考慮傳回值或委託方法,除非有特殊需求。 此外,所有範例都需要定義一個Person
類,包含一個名為Name
的string
屬性。
以上是如何在 C# 中有效地透過引用傳遞屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!