public static void Convert(Hashtable argDatas, object argObject);
这个方法的功能是,以Hashtable的key为依据自动为argObject的同名属性赋值?
请问这个方法应该如何写?

解决方案 »

  1.   

    用了,但是总写不对,argObject的属性的值一直不变。public static void Convert(Hashtable argDatas, object argObject)
    {
      Type type = argObject.GetType();
      object obj = type.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
      foreach(string keyName in argDatas.Keys)
      {
        type.InvokeMember(keyName, BindingFlags.SetProperty, null, obj, new object[] {argDatas[keyName]});
      }
    }
      

  2.   

    代码的功能是:根据控件名、属性名进行取值和赋值,可惜是VB.NET的,自己用工具转一下吧,比如SharpDevelope'必须引用命名空间System.Reflection,System.ComponentModel '以下根据控件名和属性名取值 Public Function GetValueControlProperty(ByVal ClassInstance As Object, ByVal ControlName As String, ByVal PropertyName As String) As Object Dim Result As Object Dim myType As Type = ClassInstance.GetType Dim myFieldInfo As FieldInfo = myType.GetField("_" & ControlName, BindingFlags.NonPublic Or _ BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.Instance) If Not myFieldInfo Is Nothing Then Dim properties As PropertyDescriptorCollection = TypeDescriptor.GetProperties(myType) Dim myProperty As PropertyDescriptor = properties.Find(PropertyName, False) If Not myProperty Is Nothing Then Dim ctr As Object ctr = myFieldInfo.GetValue(ClassInstance) Try Result = myProperty.GetValue(ctr) Catch ex As Exception MsgBox(ex.Message) End Try End If End If Return Result End Function '以下根据控件名和属性名赋值 Public Function SetValueControlProperty(ByVal ClassInstance As Object, ByVal ControlName As String, ByVal PropertyName As String, ByVal Value As Object) As Object Dim Result As Object Dim myType As Type = ClassInstance.GetType Dim myFieldInfo As FieldInfo = myType.GetField("_" & ControlName, BindingFlags.NonPublic _ Or BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.Instance) '加"_"这个是特要紧的 If Not myFieldInfo Is Nothing Then Dim properties As PropertyDescriptorCollection = TypeDescriptor.GetProperties(myType) Dim myProperty As PropertyDescriptor = properties.Find(PropertyName, False) '这里设为True就不用区分大小写了 If Not myProperty Is Nothing Then Dim ctr As Object ctr = myFieldInfo.GetValue(ClassInstance) '取得控件实例 Try myProperty.SetValue(ctr, Value) Result = ctr Catch ex As Exception MsgBox(ex.Message) End Try End If End If Return Result End Function '调用 '以下实现Label1.Text=TextBox1.Text,Label2.Text=TextBox2 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer For i = 1 To 2 Me.SetValueControlProperty(Me, "Label" & i.ToString, "Text", GetValueControlProperty(Me, "TextBox" & i.ToString, "Text")) Next i End Sub
      

  3.   

    帮你转了public object SetValueControlProperty( object ClassInstance,  string  ControlName,  string  PropertyName,  object value) { object Result ; Type myType = ClassInstance.typeof ; FieldInfo myFieldInfo = myType.GetField("_" + ControlName, BindingFlags.NonPublic _ || BindingFlags.Instance || BindingFlags.public || BindingFlags.Instance) //加"_"这个是特要紧的 ;if (! myFieldInfo == null ) {  PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(myType) ; PropertyDescriptor my = properties.Find(PropertyName, false) //这里设为True就不用区分大小写了 ; {if (! my == null ) {  { object ctr ;ctr = myFieldInfo.GetValue(ClassInstance) //取得控件实例 ;try { myProperty.SetValue(ctr, value) ;Result = ctr ;} catch (GAIS) { Exception ex ;MsgBox(ex.Message) ;} } } return Result ;} //调用 //以下实现Label1.Text=TextBox1.Text,Label2.Text=TextBox2 private void Button1_Click( System.object sender,  System.EventArgs e)  Button1.Click { int i ;for ( i = 1 ; GAIS <= 2 this.SetValueControlProperty(this, "Label" + i.ToString, "Text", GetValueControlProperty(this, "TextBox" + i.ToString, "Text")) ;} // i }
      

  4.   

    我改了一下,可是不行,总抛出对象与目标类型不匹配的异常信息,这是我修改的代码。Type type = argObject.GetType();
    PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(type);
    object obj = type.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
    foreach(string keyName in argDatas.Keys)
    {
    FieldInfo myFieldInfo = type.GetField("_" + keyName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Instance);
    object ctr = myFieldInfo.GetValue(argObject);
    PropertyDescriptor myProperty = properties.Find(keyName, true);
    myProperty.SetValue(ctr, argDatas[keyName]); /*
    try
    {
    type.InvokeMember(keyName, BindingFlags.SetProperty, null, obj, new object[] {argDatas[keyName]});
    }
    catch {
    throw new Exception(keyName);
    throw new Exception((argDatas[keyName]).GetType().ToString());
    }*/
    }
      

  5.   

    至于写那么复杂吗?public static void Convert(Hashtable argDatas, object argObject)
    {
        Type t = argObject.GetType();    foreach (DictionaryEntry argData in argDatas)
        {
            string propName = (string)argData.Key;        PropertyInfo prop = t.GetProperty(propName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);        prop.SetValue(argObject, argData.Value, null);
        }
    }
      

  6.   

    你必须确保Hastable argDatas的Key是一个字符串,而Value则是这个名称属性的待设值,类型必须匹配。
    比如Button类的一个例子static void Main(string[] args)
    {
        Button b = new Button();    Hashtable ht = new Hashtable();    ht.Add("Name", "myButton");
        ht.Add("Text", "Hello");
        ht.Add("Size", new Size(10, 10));
        ht.Add("Location", new Point(1, 1));    Convert(ht, b); //这就是那个方法!
    }
      

  7.   

    public static void Convert(Hashtable argDatas, object argObject)
    {
          Type t = argObject.GetType();
          foreach (object key in argDatas.Keys)
          {
               System.Reflection.PropertyInfo pinfo = t.GetProperty(key.ToString(), BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);           if(pinfo != null)
                    pinfo.SetValue(argObject,argDatas[key],null);
           }
    }