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)。但是,由于我无法覆盖ColorEquals(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/

10-17 00:26
查看更多