【问题标题】:How Can Set Dynamic Type <T> By Object Type?如何通过对象类型设置动态类型<T>?
【发布时间】:2015-09-03 11:25:12
【问题描述】:

我想用对象类型更改我的实体类

MyEntity=x.GetType();

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
ObjectSet<MyEntity> set = objectContext.CreateObjectSet<MyEntity>();
IEnumerable<string> keyNames = set.EntitySet.ElementType
                                            .KeyMembers
                                            .Select(k => k.Name);

改成

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
ObjectSet<x.GetType()> set = objectContext.CreateObjectSet<x.GetType()>();
IEnumerable<string> keyNames = set.EntitySet.ElementType
                                            .KeyMembers
                                            .Select(k => k.Name);

【问题讨论】:

  • 你的问题是什么?
  • 我想将 TEntity 更改为我的对象类型
  • 您不能在运行时设置泛型类型参数,这是编译时的事情。您可以在运行时使用反射构造泛型类型,但它很繁琐。

标签: c# entity-framework entity-framework-5


【解决方案1】:

通过使用Reflection,您可以通过x 的运行时类型调用CreateObjectSet 方法。然后您可以提取键名。这是执行此操作的扩展方法:

public static class ObjectContextExtensions
{
    public static EntitySet GetEntitySet(this ObjectContext objectContext, object x)
    {
        //Get the approperiate overload of CreateObjectSet method
        var methodInfo = typeof(ObjectContext).GetMethods()
                         .Where(m => m.Name == "CreateObjectSet").First();

        //Supply the generic type of the method
        var genericMethodInfo = methodInfo.MakeGenericMethod(x.GetType());

        //Invoke the method and get the ObjectSet<?> as an object          
        var set = genericMethodInfo.Invoke(objectContext, new object[] { });

        //Retrieve EntitySet of the set
        var prop = set.GetType().GetProperty("EntitySet");
        var entitySet = (EntitySet)prop.GetValue(set);
        return entitySet;
    }
}

现在您可以将代码更新为:

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var set = objectContext.GetEntitySet(x);
var keyNames =  set.ElementType.KeyMembers.Select(k => k.Name);

编辑:更简单的版本是:

public static class ObjectContextExtensions
{
    public static EntitySet GetEntitySet<T>(this ObjectContext objectContext, T x)
    {
        return objectContext.CreateObjectSet<T>();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2013-02-19
    • 2020-07-25
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多