Явное преобразование из целого числа в сущность? - PullRequest
0 голосов
/ 24 марта 2012

Возможно ли в Entity Framework создать специальный метод преобразования для преобразования целого числа в сущность посредством явного преобразования?

Я провел некоторые исследования по этому вопросу, и я не знаю, с чего начать.

Вот пример того, что я пытаюсь сделать.

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

Редактировать 1 После небольшого исследования я понял, что мне, вероятно, нужно что-то сделатьс EntityObject, если мне нужно, чтобы все было по-настоящему универсальным и гибким.Однако я не уверен, как это сделать.

Редактировать 2 Исходя из собственного опыта, мне удалось создать следующий код.Однако по понятным причинам я не могу получить «это» в статическом контексте.

Если бы я мог просто каким-то образом получить тип объекта, в который он преобразуется (поскольку он не всегда преобразуется в объект 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 голосов
/ 25 марта 2012

Я наконец сделал это! Основываясь на предложениях Питера (см. Его комментарий к моему вопросу), я создал метод расширения "int", который позволяет мне выполнять действия, которые я ищу.

Я очень горжусь этим алгоритмом, так как сам понял большую его часть. Это требует серьезных размышлений, динамического создания лямбда-выражений и их оценки. Но это работает!

Буду признателен за любые предложения по его сокращению или улучшению.

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;

        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...