C#中是否有类似匿名内部类(在Java中使用)的东西?
我举例说明了它的用法:我在声明和初始化类型的字段,IDictionary<Person, Account>
我需要编写custom IEqualityComparer<Person>
。那是因为我希望两个人在名称和ID相同的情况下被IDictionary视为相等(默认情况下不仅是ID)。我IEqualityComparer<Person>
在代码中的其他任何地方都不需要这个。
因此,我必须声明IEqualityComparer<Person>
要实现此目的的新类吗?在Java中,我将使用匿名类,类似这样的东西(这是C#-Java混合语法,只是为了显示我正在寻找的功能):
IDictionry<Person, Account> myDict = new Dictionary<Person, Account>(
new IEqualityComparer<Person>(){
public bool Equals(Person a, Person b){
return a.Id == b.Id && a.Name == b.Name;
}
public int GetHashCode(Person p){
return p.Id.GetHashCode() * p.Name.GetHashCode();
}
});
在C#中是这样的吗?每当我需要这样的东西时,我都懒得写新课。
注意:这是语法问题。我知道如何编写,但是我想知道是否可以使代码更短。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
编辑:您自己如何编码类似的情况?您是创建新类来实现接口还是做什么?也许您有一些我可能喜欢的把戏。
编辑将来如何支持Java中的匿名类?你听说过什么吗?
编辑:嗯,我知道我必须提供我的实际代码-而不仅仅是一个例子。那是因为我不知道它是否可以与Jon's Skeet的解决方案一起使用。
实际的原因,我不只是落实Equals(object)
和GetHashCode
在类本身,通过从模型图ER框架生成它的类(实体)。如果我在类本身中实现它,则每次我从数据库更新模型时(使用“从数据库更新”功能),我的代码都将从类(实体)中删除。该类实际上称为Font
not Person
。它具有以下特性:
Id: int
FamilyName:string
Size:int
Bold:bool
Italic:bool
Underlined:bool
Striked:bool
Foreground:Color
Color
从数据库生成的另一个类(实体)在哪里。
这是颜色的属性:
Id:int
Alpha:byte
Red:byte
Green:byte
Blue:byte
因此,我既不能修改字体,也不能修改颜色(如果我不想每次更改数据库时都一遍又一遍地重写那些更改),我想要的是Dictionary
:
private IDictionary<Font, Something> cache = new Dictionary<Font, Something>(new SomeEqualityComparer());
并且比较器SomeEqualityComparer
应确保当且仅当以上列出的所有属性(除外Id
)相等时,两个字体才会被视为相等。在最后一个属性的情况下,当Foreground
两个Color
它们的所有属性(除外Id
)相等时,它们就被认为是相等的。
现在,如果我使用Jon Skeet推荐给我的解决方案,我不确定是否可以保证。如果我使用类似:
private IDictionary<Font, Something> cache = new Dictionary<Font, Something>(ProjectionEqualityComparer<Font>.Create
(f => new { f.FontName, f.Size, f.Bold, f.Italic, f.Underlined, f.Striked, f.Foreground});
我猜想匿名类型会在调用Equals(object)
所有属性时Equals(object)
调用。但是,由于我无法覆盖Color
,Equals(object)
因此无法Color
按我的要求比较s(使用除外的所有属性Id
),因此Font
s 的相等性也将被错误地测试。我对吗 ?
在上次编辑中,您提到未实现Equals和GetHashCode的原因是因为类的代码是自动生成的,并且您不需要在每次重新生成代码时都重新实现该代码。
这是在C#中引入部分类的场景之一
许多代码生成工具会生成带有partial关键字的类,以使您能够利用该功能。检查为您的代码生成的类是否是局部的。
在同一程序集中的一个单独的文件(一个或多个文件)中,当您重新生成代码时,这些文件不会被覆盖,您可能会遇到以下类似情况:
partial class Font
{
public override bool Equals(object obj)
{
// ...
}
public override int GetHashCode()
{
// ...
}
}
partial class Color
{
public override bool Equals(object obj)
{
// ...
}
public override int GetHashCode()
{
// ...
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句