C#中是否有类似匿名内部类(在Java中使用)的东西?
我举例说明了它的用法:我声明并初始化了IDictionary<Person, Account>
类型的字段,我需要编写自定义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#中是这样的吗?每当我需要这样的东西时,我都懒得写新课。
注意:这是语法问题。我知道如何编写,但是我想知道是否可以使代码更短。
------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -
编辑:您自己如何编写类似的案例?您是创建新类来实现接口(interface)还是做什么?也许您有一些我可能喜欢的把戏。
编辑将来对Java等匿名类的支持如何?你听说过什么吗?
编辑:好吧,我知道我必须提供我的实际代码-不仅仅是一个例子。那是因为我不知道它是否可以与Jon's Skeet的解决方案一起使用。
我不仅仅在类本身中实现
Equals(object)
和GetHashCode
的实际原因是,它是E-R框架从模型图中生成的类(实体)。如果我在类本身中实现它,则每次我从数据库更新模型时(使用“从数据库更新”功能),我的代码都将从类(实体)中删除。该类实际上称为Font
而不是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的原因是因为类的代码是自动生成的,并且您不需要在每次重新生成代码时都重新实现该代码。
这是partial classes were introduced in 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()
{
// ...
}
}
关于c# - C#中的匿名内部类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3543259/