2013-05-07 180 views
0

我需要获取和设置属性值动态设置属性值

我读这Get property value from string using reflection in C#

,做了下面的代码用于获取的值

public Object GetPropValue(Object obj, String name) { 
    foreach (String part in name.Split('.')) { 
     if (obj == null) { return null; } 

     Type type = obj.GetType(); 
     PropertyInfo info = type.GetProperty(part); 
     if (info == null) { return null; } 

     obj = info.GetValue(obj, null); 
    } 
    return obj; 
} 

现在我需要设置值到具有相同属性名称的其他对象

Employee emp1=new Employee(); 
var city=GetPropValue(emp1, "Address.City"); 

Need to set this city to other employee. Here Address is other class 

emp1.GetType().GetProperty("Address.City").SetValue(emp2,city,null) //always sets null 

但它是n ot设置。我怎样才能使一个通用的setter方法使这个工作简单?

回答

2

这条线是不正确的:

emp2.Address.City= emp1.GetType().GetProperty("Address.City").SetValue(emp2,city,null) 

你试图设置调用属性的二传手给定对象上的emp2.Address.City结果。

为什么你想在这种情况下使用反射?鉴于你的代码行,你可以写

emp2.​​Address.City = city;

由于您的反射代码也设置了emp2的属性。所以即使它起作用了,它也会做同样的事情两次。

您的代码会是这样书写:

emp2.Address.City = city; 
emp1.GetType().GetProperty("Address.City").SetValue(emp2,city,null); 
+0

即使我想这样也。但它总是设置为空。我们如何设置嵌套的对象属性? – Billa 2013-05-07 11:44:07

+0

'city'是否有值或是'city'' null'?你有没有尝试设置一个断点? – 2013-05-07 12:14:34

-1
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Text; 
using System.Threading.Tasks; 

namespace LinqTests 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var f1 = new F1 { F2 = new F2 { Name = "Test"}, Q = 10 }; 
      var f3 = new F3 { F2 = new F2() }; 
      Copier.Copy(f1, f3, "Q"); 
      Copier.Copy(f1, f3, "F2.Name"); 

     } 

     static class Copier 
     { 
      public static void Copy(object source, object destination, string navigationPath) 
      { 
       var sourceValuePointHandle = GetValuePointHandle(source, navigationPath); 
       var destinationValuePointHandle = GetValuePointHandle(destination, navigationPath); 
       destinationValuePointHandle.SetValue(sourceValuePointHandle.GetValue()); 
      } 

      private static ValuePointHandle GetValuePointHandle(object instance, string navigationPath) 
      { 
       var propertyName = new String(navigationPath.TakeWhile(x => x != '.').ToArray()); 
       var property = instance.GetType().GetProperty(propertyName); 

       if (propertyName.Length != navigationPath.Length) 
       { 
        var propertyInstance = property.GetValue(instance, null); 
        return GetValuePointHandle(propertyInstance, navigationPath.Substring(propertyName.Length + 1, navigationPath.Length - propertyName.Length - 1)); 
       } 
       else 
        return new ValuePointHandle(instance, property); 
      } 

      class ValuePointHandle 
      { 
       public object Instance 
       { 
        get; 
        private set; 
       } 

       public PropertyInfo Property 
       { 
        get; 
        private set; 
       } 

       public ValuePointHandle(object instance, PropertyInfo property) 
       { 
        Instance = instance; 
        Property = property; 
       } 

       public void SetValue(object value) 
       { 
        Property.SetValue(Instance, value, null); 
       } 

       public object GetValue() 
       { 
        return Property.GetValue(Instance, null); 
       } 
      } 
     } 

     class F1 
     { 
      public int Q 
      { 
       get; 
       set; 
      } 

      public F2 F2 
      { 
       get; 
       set; 
      } 
     } 

     class F2 
     { 
      public string Name 
      { 
       get; 
       set; 
      } 
     } 

     class F3 
     { 
      public int Q 
      { 
       get; 
       set; 
      } 

      public F2 F2 
      { 
       get; 
       set; 
      } 
     } 
    } 

} 
+0

这是一个很大的代码与零解释。错误的答案。 – 2013-05-07 13:39:52

+0

这只是一种魔力。它不需要解释。 – user1770543 2013-05-07 13:54:17

+0

我想也许你误解了这个网站的目的......没有“魔法”,只有代码,可以随时解释。 – 2013-05-07 14:28:27