-2

我有我想写的这个方法:

public static IQueryable<TSource> CutTo<TSource>(this IQueryable<TSource> source, Func<int> func)
{
    int index = func();
    // here I can write something for all types or switch all
    // the types and write code for every type
}

为所有 TSource 类型编写此代码的最简单方法是什么?

编辑:黑熊写道,这已经适用于所有类型,但事实并非如此。Mono 是这样写的:

public static IQueryable<TSource> Where<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
{
    Check.SourceAndPredicate (source, predicate);

    return source.Provider.CreateQuery<TSource> (
        StaticCall (
            MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
            source.Expression,
            Expression.Quote (predicate)));
}
4

1 回答 1

1

第一种解决方案(更清洁的)

仅适用于实现特定接口的类型

创建接口IHaveId

public interface IHaveId
{
    int Id { get; set; }
}

然后每个具有属性的模型Id都应该实现IHaveId。例子

public class Post : IHaveId
{
    int Id { get; set; }
    string Title { get; set; }
    string Content { get; set; }
}

然后像这样写你的CutTo方法:

public static IQueryable<T> CutTo<T>(this IQueryable<T> source, Func<int> func)
    where T: IHaveId
{
    int index = func();
    return source.Where(x => x.Id == index);
}

这个想法是每个实现IHaveId都会int调用属性Id,然后您可以将CutTo方法限制为仅与实现一起IHaveId使用并使用它们的Id属性。

第二种解决方案(更丑陋)

适用于任何保持实体框架命名主键约定的类型

  1. 使用反射typeof(TSource)来查找名为Id或的属性typeof(TSource).Name + "Id"
  2. 再次使用反射构建Expression<Func<TSource, int>>并将其应用于IQueryable<T> sourcewithWhere子句。
于 2015-02-14T16:49:58.083 回答