表达式中的引用泛型属性

时间:2009-06-01 20:23:00

标签: c# asp.net-mvc generics lambda

假设我有两张桌子,午餐和晚餐。我知道两者都包含DateTime属性“Time”。

如果我有一个通用方法GetTime,那么当T是Lunch时我怎么能返回db.Lunch.Time?当T是Dinner时我怎么能返回db.Dinner.Time?我试图在不使用typeof单独测试T的情况下实现这一目标,而是一般地。

伪代码:

public T GetTime<T>(DateTime dt)
{
    return MyDataContext.GetTable<T>().Where(entity => entity.Time == dt);
}

public T GetTime<T>(DateTime dt) { return MyDataContext.GetTable<T>().Where(entity => entity.Time == dt); }

所以,当我打电话给GetTime&lt; Dinner&gt;它将自动在晚餐表中查看所有晚餐实体,其属性时间等于我提供的参数dt。

问题在于我无法在表达式中指定 entity.Time ,因为T是泛型。我的问题是如何解决这个问题,以便我可以查找任何T(知道我的所有实体都拥有 Time属性),而无需为晚餐和午餐创建特定方法。

3 个答案:

答案 0 :(得分:5)

你必须让两个类都实现这样的接口:

public interface IMyInterface
{
   DateTime Time{get;set;}
}

然后在你的通用方法中:

public void MyMethod<T>(T item) where T: IMyInterface
{
    //here you can access item.Time
}

答案 1 :(得分:1)

您可以使用具有名为Time

属性的Lunch and Dinner实现的界面
 public interface IMealTime
    {
        DateTime Time { get; set; }
    }

    public class Lunch : IMealTime
    {
        #region IMealTime Members

        public DateTime Time { get; set; }

        #endregion
    }

    public class Dinner : IMealTime
    {
        #region IMealTime Members
        public DateTime Time { get; set; }

        #endregion
    }

    public class GenericMeal
    {
        public DateTime GetMealTime<T>(T meal) where T: IMealTime
        {
            return meal.Time;
        }
    }

答案 2 :(得分:0)

当然,你总是可以使用反射。此外,如果这两种类型实现了具有Lunch属性的公共接口,则可以使用它。 (我不明白这里的“表”是什么意思。)