Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有嵌套泛型的扩展方法_C#_Generics_Extension Methods - Fatal编程技术网

C# 具有嵌套泛型的扩展方法

C# 具有嵌套泛型的扩展方法,c#,generics,extension-methods,C#,Generics,Extension Methods,我在一个多语言网站上工作,我为我的可本地化实体构建了这个结构 接口: public interface ILocalizable<T> where T : ILocalized { ICollection<T> Content { get; set; } } public interface ILocalized { int LanguageId { get; set; } virtual Language Language { get;

我在一个多语言网站上工作,我为我的可本地化实体构建了这个结构

接口:

public interface ILocalizable<T>
    where T : ILocalized
{
    ICollection<T> Content { get; set; }
}

public interface ILocalized
{
    int LanguageId { get; set; }
    virtual Language Language { get; set; }
}
一切正常。我刚想到写另一个扩展方法,这样可以在构建查询时节省一些工作。这样我就不用一直写:

IQueryable<Entity> query; // some query
return query.Include(entity => entity.Content.Select(localized => localized.Language));
所以我有这个:

public static IQueryable<TEntity> WithLocalization<TEntity>(this IQueryable<TEntity> query)
{
    return query.Include(entity => entity.Content.Select(content => content.Language));
}
但显然我需要指定泛型类型。这不会编译。我什么都试过了

public static IQueryable<TEntity> WithLocalization<TEntity>(this IQueryable<ILocalizable<ILocalized>> set) where TEntity : ILocalizable<ILocalized> {}

IQueryable<Entity> query; // get query
query.WithLocalization(); // intellisense doesn't display and this won't compile
我有点理解原因。这里已经讨论过很多次了。我只是想知道是否有一种方法可以在不需要显式使用和传递2种泛型类型的情况下构建这样的扩展方法,如:

public static IQueryable<TEntity> WithLocalization<TEntity, TEntityLocalized>(this IQueryable<TEntity> set)           
    where TEntityLocalized : ILocalized
    where TEntity : ILocalizable<TEntityLocalized> {}
谢谢大家!

我想你想要

public static IQueryable<ILocalizable<TEntityLocalized>> WithLocalization<TEntityLocalized>(this IQueryable<ILocalizable<TEntityLocalized>> query)
    where TEntityLocalized : ILocalized {
    return query.Include(entity => entity.Content.Select(content => content.Language));
}

您没有将TEntity泛型参数正确传播到签名中

public static IQueryable<ILocalizable<TEntity>> WithLocalization<TEntity>(this IQueryable<ILocalizable<TEntity>> query)
    where TEntity : ILocalized
  {
      return query.Include (entity => entity.Content.Select (content => content.Language));
  }

public class Test
{
   public Test()
   {
      IQueryable<Entity> query;
      query.WithLocalization ();
   }
}

正确编译并提供正确的智能感知。

这对我不起作用。在这种情况下,我得到了一个错误:不能将类型'IQueryable'隐式转换为'Entity'作为运行时例外?这没有意义。无论t是什么,您都无法将IQueryable转换为t。对不起,我写得不对。它是:IQueryable到IQueryable这仍然没有意义。你能给我们看看你的呼叫代码吗?只是好奇,为什么虚拟语言属性。具体类是否将被继承?
public static IQueryable<ILocalizable<TEntityLocalized>> WithLocalization<TEntityLocalized>(this IQueryable<ILocalizable<TEntityLocalized>> query)
    where TEntityLocalized : ILocalized {
    return query.Include(entity => entity.Content.Select(content => content.Language));
}
public static IQueryable<ILocalizable<TEntity>> WithLocalization<TEntity>(this IQueryable<ILocalizable<TEntity>> query)
    where TEntity : ILocalized
  {
      return query.Include (entity => entity.Content.Select (content => content.Language));
  }

public class Test
{
   public Test()
   {
      IQueryable<Entity> query;
      query.WithLocalization ();
   }
}