使用反射查找集合属性,然后添加到集合

时间:2017-05-05 09:22:49

标签: c# entity-framework linq reflection

我正在尝试创建一个通用函数来在实体框架中添加关系记录。我正在研究以下解决方案。虽然如果我这么做,那么你可以指引我走向正确的方向。

我有以下课程。另请注意,这是实体框架中的代码优先方法。

public class MainTable
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int MainTableID { get; set; }

    public int LookupID { get; set; }

    [ForeignKey("LookupID")]
    public virtual LookupTable Lookups { get; set; }
}

public class LookupTable
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int LookupID{ get; set; }

    public string LookupText { get; set; }

    public virtual ICollection<MainTable> MainTable { get; set; }
}

然后我有以下代码,我试图在MainTable和LookupTable之间添加关系。我首先传递两个表类类型,并传递记录添加和集合属性的名称。

问题是&#34; collectionField&#34;每当我尝试转换它时都为NULL(ICollection(MainTable))。我需要&#34; collectionField&#34;成为ICollection类型(MainTable),所以我可以添加MainTable记录,除非我以错误的方式解决这个问题。

public void AddRelationalRecord<MainTableType, LookupTableType>(MainTableType recordToAdd, string collectionFieldName)  
where MainTableType: class                                                                                                             
where LookupTableType: class
    {
        var collectionField = typeof(LookupTableType)
                                        .GetProperties()
                                        .Where(prop => prop.Name == collectionFieldName)
                                        .FirstOrDefault();

        collectionField.Add(recordToAdd);           
    }

1 个答案:

答案 0 :(得分:0)

从评论中我决定改变我对此的态度。如果有人有兴趣,以下代码可以使用。

public void AddRelationalRecord(object recordToAdd, object recordWithCollection, string collectionFieldName)
{
    var collectionProp = recordWithCollection.GetType().GetProperty(fieldName);
    collectionProp.PropertyType.GetMethod("Add").Invoke(aaa.GetValue(recordWithCollection, null), new object[] { recordToAdd });           
}