Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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 - Fatal编程技术网

C# 使用子类创建泛型

C# 使用子类创建泛型,c#,generics,C#,Generics,我试图创建一种通用方法来保存给定类中应该搜索的属性 我已创建以下结构来保存此信息: public struct Lookup<T> where T: BaseEntity { public Expression<Func<T, object>> Parent { get; set; } } new Lookup<Agency> { Parent = x => x.Id }; 我使用以下信息创建一个新

我试图创建一种通用方法来保存给定类中应该搜索的属性

我已创建以下结构来保存此信息:

public struct Lookup<T> where T: BaseEntity
{            
    public Expression<Func<T, object>> Parent { get; set; }
}
new Lookup<Agency>
{
    Parent = x => x.Id
};
我使用以下信息创建一个新的查找结构:

public struct Lookup<T> where T: BaseEntity
{            
    public Expression<Func<T, object>> Parent { get; set; }
}
new Lookup<Agency>
{
    Parent = x => x.Id
};
新查找
{
父项=x=>x.Id
};
但如果我尝试将其添加到字典中,则会出现以下错误:

无法从查找转换为查找

我原以为这是可行的,因为它们是相同的基本类型,这是怎么回事

我有相当多的实体要添加,所以我希望一般地做它,而不是必须做if/switch等

谢谢

不,
查找
不是
查找
的基本类型。
Agency
源自
BaseEntity
的事实是不够的。但首先,让我们看看其他的东西

考虑一下通常的方差规则。您的方法对应于

object DoSomething(T x) { ... }
现在,在
查找中
,这将成为

object DoSomething(BaseEntity x) { ... }
到目前为止,一切顺利-通过
代理机构
代替
基本实体
,这是完全合法的,因为
代理机构
源于
基本实体
。然而,事实并非如此。您创建了以下内容:

object DoSomething(Agency x) { ... }
显然,您不能传递
BaseEntity
而不是
Agency
——这将彻底中断键入。与Java不同的是,C#的泛型(以及.NET的泛型)在编译时和运行时都是真实的,它们不会返回到
查找

此外,C#/.NET限制了方差的使用。您可以在简单表达式和委托中免费获得方差,但在类或泛型类中则不能。您需要明确说明所需的差异类型,并使用接口。例如,在您的情况下,您会有如下内容:

public interface ILookup<out T>

读入协方差。太棒了!回答得很好。我没想到会有这么好的答案!这正是我想要的,谢谢你的帮助!
public sealed class Lookup
{
  private readonly Expression parent;

  private Lookup(Expression parent)
  {
    this.parent = parent;
  }

  public Expression Parent { get { return parent; } }

  public static Lookup For<T>(Expression<Func<T, object>> member)
    where T : BaseEntity
  {
    return new Lookup(member);
  }
}