Eigenschaften als Referenz in C# übergeben
Das Übergeben von Eigenschaften als Referenz in C# ist nicht trivial, da Eigenschaften keine Referenzen auf ihre Hintergrundfelder offenlegen. Es gibt jedoch Möglichkeiten, ein ähnliches Verhalten zu erreichen.
1. Rückgabewert:
Diese Methode gibt den Eingabewert zurück, wenn er nicht null oder leer ist, andernfalls gibt sie den ursprünglichen Eigenschaftswert zurück.
<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. Delegierter:
Mit Hilfe von Delegaten können Eingabewerte Eigenschaften durch Delegatenoperationen zugewiesen werden.
<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-Ausdruck:
Diese Methode verwendet einen LINQ-Ausdruck, um die Hintergrundfelder der Eigenschaft abzurufen und den Eingabewert zuzuweisen. (Das Codebeispiel dieser Methode enthält Syntaxfehler im Originaltext und kann nicht direkt ausgeführt werden. Unten finden Sie ein korrigiertes Beispiel, das jedoch möglicherweise entsprechend der tatsächlichen Situation angepasst werden muss.)
<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. Reflexion:
Reflection kann verwendet werden, um auf die zugrunde liegenden Felder einer Eigenschaft zuzugreifen und Eingabewerte zuzuweisen.
<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>
Es ist zu beachten, dass die Methode der Verwendung von Reflektion und LINQ-Ausdrücken zwar den Zweck erreichen kann, aber relativ ineffizient ist und auch die Lesbarkeit und Wartbarkeit des Codes beeinträchtigt sein kann. Es wird empfohlen, Rückgabewerten Vorrang einzuräumen oder Methoden zu delegieren, sofern keine besonderen Anforderungen bestehen. Darüber hinaus erfordern alle Beispiele die Definition einer Person
-Klasse, die ein Name
-Attribut mit dem Namen string
enthält.
Das obige ist der detaillierte Inhalt vonWie kann ich Eigenschaften in C# effektiv per Referenz übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!