从整数到实体的显式转换?

时间:2012-03-23 23:33:35

标签: c# entity-framework

在Entity Framework中是否可以制作一个自定义转换器方法,通过显式转换将整数转换为实体?

我对此做了一些研究,我不知道从哪里开始。

以下是我正在尝试做的一个例子。

int activeTeacherId = 38;
Teacher activeTeacher = (Teacher)activeTeacherId;

编辑1 经过一些快速研究后,我发现如果我需要一切真正的通用和灵活的话,我可能需要对EntityObject做一些事情。但是,我不确定如何。

编辑2 根据我自己的经验,我设法创建了以下代码。但是,由于显而易见的原因,我无法在静态上下文中获得“this”。

如果我能够以某种方式得到它被转换成的对象的类型(因为它并不总是被转换为EntityObject,但有时是人或教师),那么它理论上会起作用。

public class EntityObject : System.Data.Objects.DataClasses.EntityObject
{
    public static explicit operator EntityObject(int id)
    {
        var container = ModelContainer.Instance;

        var thisType = this.GetType(); //this can't be done from a static context, so how do we retrieve the type that we are converting into?
        var containerType = typeof (ModelContainer);

        dynamic setProperty = typeof (ModelContainer).GetProperty(thisType.Name + "Set");

        ObjectSet<dynamic> set = setProperty.GetValue(container);

        return set.FirstOrDefault(o => o.Id == id);
    }
}

1 个答案:

答案 0 :(得分:0)

我终于做到了!基于Peter的建议(参见他对我的问题的评论),我在“int”上创建了一个扩展方法,允许我执行我正在寻找的动作。

我为这个算法感到自豪,因为我自己想出了大部分算法。它涉及一些严肃的反思内容,lambda表达式的动态创建以及对它们的评估。但它有效!

任何使其更短或更好的建议都将受到赞赏。

public static class EntityObjectExtensions
{

    private static int Id;

    public static T ToEntity<T>(this int id) where T : class
    {

        lock(typeof(ModelContainer))
        {

            Id = id;

            var container = ModelContainer.Instance;

            var thisType = typeof (T);
            while (thisType.BaseType != typeof (EntityObject))
            {
                thisType = thisType.BaseType;
            }

            var setProperty = typeof (ModelContainer).GetProperty(thisType.Name + "Set");

            dynamic set = setProperty.GetValue(container);

            var firstOrDefaultMethod =
                typeof (Enumerable).GetMethods().FirstOrDefault(m => m.Name == "FirstOrDefault" && m.GetParameters().Count() == 2);
            var firstOrDefaultGenericMethod = firstOrDefaultMethod.MakeGenericMethod(thisType);

            var lambda = typeof (Func<,>);
            var genericLambda = lambda.MakeGenericType(thisType, typeof (bool));

            var lambdaParameter = (Func<T, bool>) Delegate.CreateDelegate(genericLambda, typeof(EntityObjectExtensions).GetMethod("Compare", BindingFlags.Static | BindingFlags.NonPublic));

            dynamic item = firstOrDefaultGenericMethod.Invoke(null, new object[] {set, lambdaParameter});

            return (T) item;

        }

    }

    private static bool Compare(dynamic item)
    {

        lock (typeof(ModelContainer))
        {

            return item.Id == Id;

        }
    }

}