0

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

我在 C# 中使用反射从字符串中读取了这个Get 属性值

并做了一个下面的代码来获取一个值

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

但它没有设置。我怎样才能制作一个通用的 setter 方法来简化这项工作?

4

2 回答 2

2

此行不正确:

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

您试图设置emp2.Address.City为在给定对象上调用属性的设置器的结果。

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

emp2.​​Address.City = 城市;

因为您的反射代码也在设置emp2. 所以即使它有效,它也会做同样的事情两次。

你的代码就像写:

emp2.Address.City = city;
emp1.GetType().GetProperty("Address.City").SetValue(emp2,city,null);
于 2013-05-07T10:53:24.283 回答
-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;
            }
        }
    }

}
于 2013-05-07T13:02:42.350 回答