Foo
是一个包含大量字符串字段的类。我想创建一个方法Wizardify
,它对对象的许多字段执行操作。我可以这样做:
Foo Wizardify(Foo input)
{
Foo result;
result.field1 = Bar(input.field1);
result.field2 = Bar(input.field2);
result.field3 = Bar(input.field3);
...
这是一些易于生成的代码,但我不想在此上浪费50行。有没有办法浏览对象的选定字段?请注意,我想以不同的方式处理四到五个字段,它们应该从迭代中排除。
答案 0 :(得分:5)
试
foreach ( FieldInfo FI in input.GetType().GetFields () )
{
FI.GetValue (input)
FI.SetValue (input, someValue)
}
虽然我不推荐针对已知类型的反射方法 - 但它很慢并且根据您的具体情况可能会在运行时出现一些权限问题...
答案 1 :(得分:0)
循环浏览typeof(YourType).GetProperties()
并致电GetValue
或SetValue
。
请注意,反射很慢。
答案 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)
;