C#使用单一方法将公共接口派生的对象添加到集合

时间:2016-05-05 16:07:46

标签: c# linq inheritance collections polymorphism

我有两种类型的对象,共享一个公共接口。我需要从存储在数据库中两个不同表中的数据创建这些对象,并将其格式化为两个单独的.NET DataTable。

这些对象基本相同,每个对象都有一些不同的属性。

 public interface IRecord
{
     int Record_ID { get; set; }
     //Other Properties
}

Class TypeA: IRecord
Class TypeB: IRecord

DataTable TypeARecords
DataTable TypeBRecords

问题

我需要在IRecord类型的单个集合中使用这些对象,这是类范围。

我目前有两种方法可以处理每种类型对象的创建并将其添加到集合中。除了正在使用的对象之外,这些方法是相同的。 我想将这些结合到一个方法中,以实现以下目标:

  1. 确定应创建的对象类型。
  2. 使用对象的类型和' RECORD_ID'
  3. 确定集合中是否已存在该对象
  4. 将对象添加到IRecord类型的单个集合
  5. 以下是作用于TypeA

    对象的方法示例
    List<IRecord> records; //This may or may not have anything in it, initially.
    
    private void CreateTypeAObjects()
    {
    
         DataTable TypeARecords = GetDataMethod();
    
    
            foreach (DataRow row in TypeARecords.Rows)
            {
                int recordID = int.Parse(row["Record_ID"].ToString());
    
    
                if (records != null && records.Count > 0)
                {
                    //If the record is of TypeA and doesn't have an existing object in the collection, create it.
                    if ((!records.Where(t => t is TypeA).Any(s => s.Record_ID == recordID)))
                    {
                        records.Add(new TypeA
                        {
                            Record_ID = int.Parse(row["Record_ID"].ToString()),
                            //Initialize other properties
                        });
    
                    }
                }
                else
                {
               //If the list is not instantiated, create it now and add record.
                    records = new List<IRecord>();
                    records.Add(new TypeA
                    {
                        Record_ID = int.Parse(row["Record_ID"].ToString()),
                        //Initialize Other Properties
    
                    });
                }
    
            }
    }
    

1 个答案:

答案 0 :(得分:1)

您可以将DataTable和Type传入GetDataMethod()函数。

List<IRecord> records = new List<IRecord>();

private void CreateAllObjects(System.Type _type, DataTable table)
{

    foreach (DataRow row in table.Rows)
    {
        int recordID = int.Parse(row["Record_ID"].ToString());


        //If the record is of the passed in type and doesn't have an existing object in the collection, create it.
        if ((!records.Where(t => t is _type).Any(s => s.Record_ID == recordID)))
            {

                IRecord record = (IRecord)Activator.CreateInstance(_type);
                //initialize record
                records.Add(record);

            }  

    }
}

DataTable是一个DataTable,您可以使用 Activator 来实例化每种类型。

您调用该函数两次以加载数据。我冒昧地根据假设我可以在声明时初始化记录列表来简化你的逻辑。

CreateAllObjects(TypeA, TypeARecords);
CreateAllObjects(TypeB, TypeBRecords);