2012-02-22 224 views
16

可能重复:
Can I set a property value with Reflection?设置属性值使用属性名

如何使用反射的时候我只有属性的字符串名我设置一个类的静态属性?例如我有:

List<KeyValuePair<string, object>> _lObjects = GetObjectsList(); 

foreach(KeyValuePair<string, object> _pair in _lObjects) 
{ 
    //class have this static property name stored in _pair.Key 
    Class1.[_pair.Key] = (cast using typeof (_pair.Value))_pair.Value; 
} 

我不知道如何设置属性的值使用属性名称字符串。一切都是动态的。我可以使用列表中的5个项目来设置5个静态属性,每个项目具有不同的类型。

感谢您的帮助。

答:

Type _type = Type.GetType("Namespace.AnotherNamespace.ClassName"); 
PropertyInfo _propertyInfo = _type.GetProperty("Field1"); 
_propertyInfo.SetValue(_type, _newValue, null); 

回答

16

你可以尝试这样的事情

List<KeyValuePair<string, object>> _lObjects = GetObjectsList(); 
var class1 = new Class1(); 
var class1Type = typeof(class1); 
foreach(KeyValuePair<string, object> _pair in _lObjects) 
    { 
     //class have this static property name stored in _pair.Key  
     class1Type.GetProperty(_pair.Key).SetValue(class1, _pair.Value); 
    } 
9

你可以得到的PropertyInfo这样并将其值设置

var propertyInfo=obj.GetType().GetProperty(propertyName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); 
propertyInfo.SetValue(obj, value,null); 
1

像这样:

class Widget 
{ 
    static Widget() 
    { 
    StaticWidgetProperty = int.MinValue ; 
    return ; 
    } 
    public Widget(int x) 
    { 
    this.InstanceWidgetProperty = x ; 
    return ; 
    } 
    public static int StaticWidgetProperty { get ; set ; } 
    public  int InstanceWidgetProperty { get ; set ; } 
} 

class Program 
{ 
    static void Main() 
    { 
    Widget myWidget = new Widget(-42) ; 

    setStaticProperty<int>(typeof(Widget) , "StaticWidgetProperty" , 72) ; 
    setInstanceProperty<int>(myWidget , "InstanceWidgetProperty" , 123) ; 

    return ; 
    } 

    static void setStaticProperty<PROPERTY_TYPE>(Type type , string propertyName , PROPERTY_TYPE value) 
    { 
    PropertyInfo propertyInfo = type.GetProperty(propertyName , BindingFlags.Public|BindingFlags.Static , null , typeof(PROPERTY_TYPE) , new Type[0] , null) ; 

    propertyInfo.SetValue(null , value , null) ; 

    return ; 
    } 

    static void setInstanceProperty<PROPERTY_TYPE>(object instance , string propertyName , PROPERTY_TYPE value) 
    { 
    Type type = instance.GetType() ; 
    PropertyInfo propertyInfo = type.GetProperty(propertyName , BindingFlags.Instance|BindingFlags.Public , null , typeof(PROPERTY_TYPE) , new Type[0] , null) ; 

    propertyInfo.SetValue(instance , value , null) ; 

    return ; 
    } 

}