使用属性名称设置属性值

本文关键字:属性 设置 | 更新日期: 2023-09-27 18:25:25

可能重复:
我可以使用反射设置属性值吗?

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

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);

使用属性名称设置属性值

您可以尝试类似的

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); 
  } 

您可以获得这样的PropertyInfo并设置值

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

像这样:

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 ;
  }
}