迭代C#中的对象字段

时间:2011-09-01 14:05:02

标签: c# reflection object

Foo是一个包含大量字符串字段的类。我想创建一个方法Wizardify,它对对象的许多字段执行操作。我可以这样做:

Foo Wizardify(Foo input)
{
    Foo result;
    result.field1 = Bar(input.field1);
    result.field2 = Bar(input.field2);
    result.field3 = Bar(input.field3);
    ...

这是一些易于生成的代码,但我不想在此上浪费50行。有没有办法浏览对象的选定字段?请注意,我想以不同的方式处理四到五个字段,它们应该从迭代中排除。

4 个答案:

答案 0 :(得分:5)

foreach ( FieldInfo FI in input.GetType().GetFields () )
{
    FI.GetValue (input)
    FI.SetValue (input, someValue)
}

虽然我不推荐针对已知类型的反射方法 - 但它很慢并且根据您的具体情况可能会在运行时出现一些权限问题...

答案 1 :(得分:0)

循环浏览typeof(YourType).GetProperties()并致电GetValueSetValue

请注意,反射很慢。

答案 2 :(得分:0)

您可以使用动态语言运行时生成 Func 类型的lambda。你只需要生成一次lambda(你可以将它缓存掉),并且不会有反射性能。

答案 3 :(得分:0)

这就是我所拥有的 - 它为我提供了我班级中所有属性的列表(名称),稍后我可以使用Reflection或“表达式树”:

private static string xPrev = "";
        private static List<string> result;

        private static List<string> GetContentPropertiesInternal(Type t)
        {
            System.Reflection.PropertyInfo[] pi = t.GetProperties();

            foreach (System.Reflection.PropertyInfo p in pi)
            {
                string propertyName = string.Join(".", new string[] { xPrev, p.Name });

                if (!propertyName.Contains("Parent"))
                {
                    Type propertyType = p.PropertyType;

                    if (!propertyType.ToString().StartsWith("MyCms"))
                    {
                        result.Add(string.Join(".", new string[] { xPrev, p.Name }).TrimStart(new char[] { '.' }));
                    }
                    else
                    {
                        xPrev = string.Join(".", new string[] { xPrev, p.Name });
                        GetContentPropertiesInternal(propertyType);
                    }
                }
            }

            xPrev = "";

            return result;
        }

        public static List<string> GetContentProperties(object o)
        {
            result = new List<string>();
            xPrev = "";

            result = GetContentPropertiesInternal(o.GetType());

            return result;
        }

用法:List<string> myProperties = GetContentProperties(myObject);