C#对类嵌套属性的反思

时间:2010-09-08 15:11:27

标签: c# linq linq-to-sql reflection properties

我想知道如何在C#中获取Property的值,但此属性属于另一种类型。

public class Customer
{
   public string Name {get; set;}
   public string Lastname {get; set;}
   public CustomerAddress Address {get; set;}
}

所以我能够获取Name和LastName的属性值,但我完全不了解如何获取CustomerAddress.City的值。

这就是我现在所拥有的。

public object GetPropertyValue(object obj, string property)
{
   if (string.IsNullOrEmpty(property))
   return new object { };

   PropertyInfo propertyInfo = obj.GetType().GetProperty(property);
   return propertyInfo.GetValue(obj, null);
} 

然后在LINQ语句中使用此方法。

var cells = (from m in model
                         select new
                         {
                             i = GetPropertyValue(m, key),
                             cell = from c in columns
                                select reflection.GetPropertyValue(m, c)
                     }).ToArray();

所以我没有得到CustomerAddress的值。

任何帮助都将深受赞赏。

****更新****

这是我设法做到的。

public object GetNestedPropertyValue(object obj, string property)
        {
            if (string.IsNullOrEmpty(property)) 
                return string.Empty;

            var propertyNames = property.Split('.');

            foreach (var p in propertyNames)
            {
                if (obj == null)
                    return string.Empty;

                Type type = obj.GetType();
                PropertyInfo info = type.GetProperty(p);
                if (info == null)
                    return string.Empty;

                obj = info.GetValue(obj, null);

            }

            return obj;
        }

2 个答案:

答案 0 :(得分:3)

首先,如果你想获得CustomerAddress.City的价值,你永远不会得到它。 CustomerAddress是类型,而不是属性名称。你想获得Address.City

尽管如此,您的GetPropertyValue并未设置为执行您想要的操作。

尝试按点分割名称:

var propertyNames = property.split('.');

现在,您有一个属性名称{"Address", "City"}

的列表

然后,您可以逐个遍历这些属性名称,递归调用GetPropertyValue

应该这样做:)

答案 1 :(得分:0)

@Michael - >倒置部分; - )

public static void SetNestedPropertyValue(object obj, string property,object value)
        {
            if (obj == null)
                throw new ArgumentNullException("obj");

            if (string.IsNullOrEmpty(property))
                throw new ArgumentNullException("property");

            var propertyNames = property.Split('.');

            foreach (var p in propertyNames)
            {

                Type type = obj.GetType();
                PropertyInfo info = type.GetProperty(p);
                if (info != null)
                {
                    info.SetValue(obj, value);
                    return;
                }

            }

            throw new KeyNotFoundException("Nested property could not be found.");
        }