2010-12-13 106 views
2

我对泛型和作为一个学习练习相当陌生我试图创建一个简单的方法,从具有指定ID的实体集(表)中选择一个实体。c#Linq to SQL和泛型

public T GetEntity<T>(int id) where T : class 
    { 
     return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
    } 

以上显然不会工作,因为oo.id是未知的,因此不能访问属性id - 有人可以与如何实现这一点帮助?

回答

1

如果你不能改变你的实体类(用于实现一个共同的接口),你可以使用一个断言函数,并将其传递到方法

public T GetEntity<T>(int id, Func<T, int, bool> predicate) where T : class 
{ 
    return db.GetTable<T>().SingleOrDefault(o => predicate(o,id)); 
} 
4

如果你所有的实体包含id属性,那么你可以定义一个接口

public interface IEntity 
{ 
    int id { get; } 
} 

实现它所有的课程和改变你的方法

public T GetEntity<T>(int id) where T : IEntity 
{ 
    return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
} 

这样的接口可以有效用于所有你想为你的实体做点事情的地方,比如说。按ID删除。你可以添加更多的属性到你的界面,即。时间戳。

0

你需要在你的T上设置一个约束,所以编译器可以确定有一个id属性。一种方法是使用接口,即。

public interface IUnique 
{ 
    int id { get; set; } 
} 

那么你可以说

public T GetEntity<T>(int id) where T : class, IUnique 
{ 
    return db.GetTable<T>().SingleOrDefault(o => o.id == id); 
} 
1

另一种解决方案,不建议性能方面的原因,但我无论如何应张贴。

public T GetEntity<T>(int id) where T : class 
    { 

     return db.GetTable<T>().AsEnumerable().SingleOrDefault(o => (int)o.GetType().GetProperty("Id").GetValue(o,null) == id); 

    }