C#用另一个带反射和linq的值替换泛型对象属性

时间:2011-03-10 22:20:59

标签: .net nhibernate c#-4.0 linq-to-objects linq-to-nhibernate

我无法想象这一个。为了简单起见,我将解释我正在尝试做什么。

目前,我正在开发一个使用存储库模式的nHibernate项目。数据库内部是一堆包含“描述”字段的表。现在,我正在尝试本地化这些表以使用通用的“资源”表。

所以,我有这两个表:

表1 - 资源: ResourceId,LanguageId,Value

表2 - LinkLabels: LinkLabelId,Description,ResourceId

然后有一个会话令牌,其中包含“LanguageId”,这是用户的首选语言。

好的,说到这里,我需要做的是从ResourcesTable获取“Value”,其中来自LinkLabels的ResourceId =来自Resources的ResourceId,用于具有“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 个答案:

答案 0 :(得分:1)

创建一个这样的界面:

interface IResource {     int ResourceId {get;组;} }

然后使用约束:

public IQueryable ToQueryable()其中T:IResource { ... }

然后你必须使所有类型都实现IResource。