【问题标题】:Set property value using property name [duplicate]使用属性名称设置属性值[重复]
【发布时间】:2012-03-13 08:31:15
【问题描述】:

可能重复:
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);

【问题讨论】:

    标签: c#


    【解决方案1】:

    你可以试试这样的

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

    【讨论】:

      【解决方案2】:

      您可以像这样获取 PropertyInfo 并设置值

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

      【讨论】:

      【解决方案3】:

      像这样:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-28
        • 1970-01-01
        • 1970-01-01
        • 2017-03-02
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多