使用多个ObservableCollection <t>

时间:2015-06-09 12:37:08

标签: c# wpf

我有一个班级:

public class ClassA 
{
   string Field1;
   int Field2;
   ObservableCollection<ClassB> col1;
   ObservableCollection<ClassC> col2;
   ObservableCollection<ClassD> col3;
   ObservableCollection<ClassE> col4;
   ObservableCollection<ClassF> col5;
   // ...
}

在我的应用程序中,当用户点击保存时,我需要遍历此类并对其每个成员执行操作。

我可以使用反射来浏览正常字段,但不知道如何:

  1. 获取每个集合
  2. 确定它的类型
  3. 循环其项目并将每个集合项目转换为其类型,以便可以使用它。
  4. 背景: 我在wpf应用程序上有多个datagrids,上面的类结构是viewModel datacontext。

    当用户点击保存时,我需要通过存储过程将viewmodel中的每个项目保存到数据库中自己的相关表中。

    一旦我有了一个集合,我需要测试IF“是一个类b”或IF“是一个C类”然后使用特定的方法,用该方法接收实际的类型。

    比硬编码更干净。

1 个答案:

答案 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);
        }
    }

}

现场演示:http://rextester.com/AJVS85556