C#中的匿名内部类?

拉斯托:

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框架生成它的类(实体)。如果我在类本身中实现它,则每次我从数据库更新模型时(使用“从数据库更新”功能),我的代码都将从类(实体)中删除。该类实际上称为Fontnot 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),因此Fonts 的相等性也将被错误地测试。我对吗 ?

威利博士的学徒:

在上次编辑中,您提到未实现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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章