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);
}
}