C # Замена свойства универсальных объектов другим значением с помощью отражения и linq - PullRequest
0 голосов
/ 11 марта 2011

Я не могу понять это.Для простоты я объясню, что я пытаюсь сделать.

В настоящее время я работаю над проектом nHibernate, который использует шаблон репозитория.Внутри базы данных находится множество таблиц с полями «Описание».Теперь я пытаюсь локализовать эти таблицы, чтобы использовать общую таблицу «Ресурс».

Итак, у меня есть две таблицы:

Таблица 1 - Ресурсы: ResourceId, LanguageId, Value

Таблица 2 - LinkLabels: LinkLabelId, Description, ResourceId

Затем есть токен сеанса, который содержит «LanguageId», который является предпочтительным языком пользователя.

Хорошо, стем не менее, мне нужно получить «Value» из ResourcesTable, где ResourceId из LinkLabels = ResourceId из Resources для объектов, имеющих «ResourceId».Но я должен сделать это с типом Generic.

Вот что у меня есть:

public IQueryable<T> ToQueryable<T>()
{
    try
    {
        PropertyInfo resourceProperty = typeof(T).GetProperty("ResourceKey");

        if (resourceProperty != null)
        {
            // Somthing like this, but of course this won't work
            // because x.ResourceId doesn't exist because of generic, and the select
            // statement is invalue.
            //
            // return from x in this.session.Query<T>()
            //        join p in this.session.Query<Resource>() on x.ResourceId equals p.ResourceId
            //        where p.LanguageId = 1 // this will be from a session object, hardcoded to 1 for now
            //        select x where x.Description is p.value;
        }
        else
        {
            return this.session.Query<T>();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

1 Ответ

1 голос
/ 11 марта 2011

Создайте такой интерфейс:

интерфейс IResource { int ResourceId {get; задавать;} }

Тогда используйте ограничение:

публичный IQueryable ToQueryable (), где T: IResource { ... }

Затем вы должны заставить все ваши типы также реализовывать IResource.

...