我有一个班级:
public class ClassA
{
string Field1;
int Field2;
ObservableCollection<ClassB> col1;
ObservableCollection<ClassC> col2;
ObservableCollection<ClassD> col3;
ObservableCollection<ClassE> col4;
ObservableCollection<ClassF> col5;
// ...
}
在我的应用程序中,当用户点击保存时,我需要遍历此类并对其每个成员执行操作。
我可以使用反射来浏览正常字段,但不知道如何:
背景: 我在wpf应用程序上有多个datagrids,上面的类结构是viewModel datacontext。
当用户点击保存时,我需要通过存储过程将viewmodel中的每个项目保存到数据库中自己的相关表中。
一旦我有了一个集合,我需要测试IF“是一个类b”或IF“是一个C类”然后使用特定的方法,用该方法接收实际的类型。
比硬编码更干净。
答案 0 :(得分:1)
可以使用反射在运行时查询类型层次结构,但是如果您尝试使用泛型,这很快就会变得很痛苦,如果您认为可以像运行那样在运行时访问类型在编译时。
下面的代码演示了问题背后的主要原因(1)和(2)。 (3)如果不希望使用每个ObservableCollection
中包含的泛型类型的详细信息,则更难回答。
var instance = new ClassA();
var fields = instance.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
foreach(var field in fields)
{
Console.WriteLine("Field name: {0}. Type:{1} IsGeneric:{2}", field.Name, field.FieldType.Name, field.FieldType.IsGenericType);
if(field.FieldType.IsGenericType)
{
var genericArgs = field.FieldType.GenericTypeArguments;
foreach(var genericArg in genericArgs)
{
Console.WriteLine("\tGenericArg Type:{0}", genericArg.Name);
}
}
}