调用泛型方法时,使用PropertyInfo作为泛型类型

时间:2017-05-05 09:33:13

标签: c# entity-framework generics reflection system.reflection

背景

我正在使用EF而且我有很多桌子。当我插入一个具有导航属性的内容但没有id的新实体(我正在从xls文件中读取内容)时,我不想显式加载所有导航属性。这是太多的代码。所以我尝试了一种通用方式:

private void loadExistingNavigationProperties<TEntity>(TEntity entityToInsert) where TEntity : class
{
    Type type = typeof(TEntity);
    var properties = type.GetProperties().Except(type.GetProperties().Where(x => x.Name.Contains("id")));
    foreach (PropertyInfo property in properties)
    {
        if (property.PropertyType.FullName.Contains("MyNamespace"))
        {
            property.SetValue(entityToInsert, findNavigationProperty<???>(property.GetValue(entityToInsert)));
        }
    }
}

我有entityToInsert。如果它具有导航属性(contains("MyNamespace")),我会检查它的所有属性。如果是这样,则应加载导航属性(见下文)并设置。

private object findNavigationProperty<TNavigationProperty>(TNavigationProperty navigationPropertyValue) where TNavigationProperty : class
{
    List<TNavigationProperty> navigationProperties = GetAllEntries<TNavigationProperty>();
    foreach (var entity in navigationProperties)
    {
        if (propertiesAreEqual(entity, navigationPropertyValue))
        {
            return entity;
        }
    }
    return navigationPropertyValue;
}

传递导航属性属性的当前值。它包含所有信息,如名称或其他内容,但不包含id。首先,我将获得具有该类型的所有可用导航属性。然后我在搜索是否有一个属性与当前属性具有相同的属性。然后返回此项并将其设置为导航属性。

编辑:

public List<TEntity> GetAllEntries<TEntity>() where TEntity : class
{
    using (var dbContext = new InventarDBEntities(MainWindow.connectionName))
    {
        return GetAllEntries<TEntity>(dbContext);
    }
}

public List<TEntity> GetAllEntries<TEntity>(InventarDBEntities dbContext) where TEntity : class
{
    return dbContext.Set<TEntity>().ToList();
}

问题

我现在的问题是如何告诉方法findNavigationProperty泛型类型是属性值的类型。所以用类型替换???

1 个答案:

答案 0 :(得分:0)

您可以检索如下通用类型:

var item = propertyInfo.GetGenericArguments()[0];

您可以使用&#34; is&#34;

来检查它是否属于类型

你也可以这样做:

item.BaseType == typeof(Whatever type your navigation props inherit);