2012-03-29 18 views
0

Ich möchte eine Eigenschaft einer Klasse erstellen und den Namen dieser Eigenschaft mit einem Variablenwert festlegen.Set PropertyName mit Variablenwert

z.

string resultValue = "stack"; 
MyClass myclass = new MyClass(); 
myclass.resultValue = "overflow"; 

Hier in diesem Fall ist stack der Eigenschaftsname und "overflow" ist der Wert der Eigenschaft stack.

Bitte sagen Sie, wie es möglich ist.

Vielen Dank im Voraus.

+0

Warum versuchen Sie Eigentum zu generieren? –

Antwort

-1

Soweit ich weiß, ist das nicht möglich. Sie können versuchen, ein Wörterbuch zu verwenden.

+2

Natürlich ist dies mit Reflection möglich. – ABH

+0

@hamad vielleicht weiß Mariusz nichts von Reflection, dann hat er nicht gelogen!:) – Bazzz

+0

@Bazzz :) dann sollte man nicht ohne Recherche und richtiges Verständnis antworten – ABH

3

Sie könnten Reflection verwenden. Zum Beispiel:

string name = "stack"; 
string value = "overflow"; 
PropertyInfo pi = typeof(MyClass).GetProperty(name); 
MyClass instance = new MyClass(); 
pi.SetValue(instance, value, null); 
// at this stage instance.stack equals to "overflow" 

Dies setzt voraus, offensichtlich, dass MyClass eine öffentliche Eigenschaft Stapel mit einem öffentlichen Setter hat:

public class MyClass 
{ 
    public string stack { get; set; } 
} 
+0

Was ist der Unterschied zwischen instance.stack = value? –

+1

Der Unterschied besteht darin, dass Sie den Namen der Variablen zum Zeitpunkt der Kompilierung nicht kennen müssen. –

+0

Wie auch immer, du musst 'pi! = Null' nach dem Namen überprüfen. –

1

Sie sollten Spiegelung für diese

MyClass myclass = new MyClass(); 
Type type = typeof(MyClass); 
PropertyInfo property = type.GetProperty("stack"); 
property.SetValue(myclass, "overflow", null); 
0

denke ich, dass die Dynamic Source Code Generation and Compilation verwenden Abschnitt auf MSDN sollte die Informationen enthalten, die Sie benötigen.

Das enthält .NET Framework einen Mechanismus des Kodex Document Object Model (CodeDOM), die Entwickler von Programmen ermöglicht, die emittieren Quellcode genannt Quellcode in mehreren Programmiersprachen zur Laufzeit, basierend auf einem einzigen zu erzeugen Modell, das den Code zu Render darstellt.

Ich denke, dass Sie dies auch mit Reflection erreichen können.

0

Ich kann mir nicht vorstellen, warum Sie Eigenschaft auf Ihrer Klasse generieren möchten, aber andere Möglichkeiten in Betracht ziehen. Z.B. Dictionary mit:

class MyClass 
{ 
    Dictionary<string, object> _values = new Dictionary<string, object>(); 

    public object this[string name] 
    { 
     get 
     { 
      if (!_values.ContainsKey(name)) 
       throw new ArgumentException(name); 

      return _values[name]; 
     } 

     set 
     { 
      if (!_values.ContainsKey(name)) 
      { 
       _values.Add(name, value); 
       return; 
      } 

      _values[name] = value; 
     } 
    } 
} 

Verbrauch:

MyClass myClass = new MyClass(); 
myClass["stack"] = "overflow"; 
Console.WriteLine(myClass["stack"]); 
+0

Schöne Technik ... Danke – user1300007

+0

Sie können die gesamte 'if'-Klausel in Ihrer' set' Methode überspringen, weil '_values ​​[name] = value' den Schlüssel hinzufügt, wenn nicht vorhanden. – ChrisWue

+0

@ChrisWue Danke, vergiss das! –

0

Vielleicht sollten Sie einen Blick auf DynamicObject nehmen. Damit können Sie Eigenschaften zur Laufzeit anlegen, indem Sie einfach einen Wert zuweisen. Ein Beispiel findet sich auch bei der MSDN article.

0

Haben Sie Blick auf Mark Gravell der FastMember

Es Sie Eigenschaften in einer dynamischen Art und Weise festlegen können.

// obj could be static or DLR 
var wrapped = ObjectAccessor.Create(obj); 
string propName = // something known only at runtime 

FastMember Blog Post

Verwandte Themen