假设我有两张桌子,午餐和晚餐。我知道两者都包含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属性),而无需为晚餐和午餐创建特定方法。
答案 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属性的公共接口,则可以使用它。 (我不明白这里的“表”是什么意思。)