2010-12-10 82 views
1

有沒有辦法在C#中動態識別設計時間屬性?例如:動態識別C#中的屬性

class MyClass 
{ 
    public string MyProperty1 { get; set; } 
} 

,然後引用它是這樣的:

string myVar = "MyProperty1"; 
MyClass.myVar = "test"; 

回答

6

如果你想在運行時設置屬性和屬性的名稱的值只在運行時,你需要知道使用Reflection。這裏有一個例子:

public class MyClass 
{ 
    public string MyProperty1 { get; set; } 
} 

class Program 
{ 
    static void Main() 
    { 
     // You need an instance of a class 
     // before being able to set property values    
     var myClass = new MyClass(); 
     string propertyName = "MyProperty1"; 
     // obtain the corresponding property info given a property name 
     var propertyInfo = myClass.GetType().GetProperty(propertyName); 

     // Before trying to set the value ensure that a property with the 
     // given name exists by checking for null 
     if (propertyInfo != null) 
     { 
      propertyInfo.SetValue(myClass, "test", null); 

      // At this point you've set the value of the MyProperty1 to test 
      // on the myClass instance 
      Console.WriteLine(myClass.MyProperty1); 
     } 

    } 
} 
+0

+1突出屬性和字段需要以不同的方式訪問的東西。 – devrooms 2010-12-10 11:17:09

0

是的,當然你可以。您需要獲取與要設置的屬性相關的FieldInfo對象。

var field = typeof(MyClass).GetField("MyProperty1"); 

然後從該字段信息的對象,您可以設置類的任何實例的值。

field.SetValue(myinstanceofmyclass, "test"); 

MSDN: FieldInfo其他有趣的東西,你可以用反射做。

+1

您應該區分[屬性](http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx)和[字段](http://msdn.microsoft.com/en-us /library/ms173118.aspx)並使用相應的反射方法來操縱它們。在這種情況下,'MyProperty1'是一個'property',所以調用'GetField'可能會返回null。 – 2010-12-10 10:59:40

1

怎麼樣只需在你的類

public class MyClass 
{ 
    public string MyProperty1 { get; set; } 

    public object this[string propName] 
    { 
     get 
     { 
      return GetType().GetProperty(propName).GetValue(this, null); 
     } 
     set 
     { 
      GetType().GetProperty(propName).SetValue(this, value, null); 
     } 
    } 
} 

實現一個索引,然後你可以做的非常相似

var myClass = new MyClass(); 
string myVar = "MyProperty1"; 
myClass[myVar] = "test";