Не знаю, подойдет ли это, но, возможно, было бы неплохо использовать генетику?
class FooRepository<T>
where T: class, IFoo, new()
{
// ...
public void Add(T foo)
{
db.Foos.InsertOnSubmit(foo);
}
}
И вы можете сделать что-то вроде этого -
Foo bar = new Foo();
FooRepository<Foo> foo = new FooRepository<Foo>();
bar.Add(bar);
Или это ...
Bar bar = new Bar(); //Bar implements IFoo
FooRepository<Bar> foo = new FooRepository<Bar>();
bar.Add(bar);
Таким образом, T в FooRepository на самом деле является Foo (или Bar), а не IFoo, поэтому приведение не требуется, но ограничение в предложении where означает, что он должен реализовывать IFoo, что делает Foo (и Bar) .