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 中国語 Web サイトの他の関連記事を参照してください。