gpt4 book ai didi

c# - 需要建议 : alternative to overloading "is" and "as" operators in . NET

转载 作者:太空狗 更新时间:2023-10-29 23:48:49 25 4
gpt4 key购买 nike

我希望这个问题不会被认为太主观 - 我真的不希望得到明确的答案,但我希望每个人的意见至少能帮助我形成自己的意见。

我正在实现一个自定义类型系统,它是经典 OOP 类型系统的超集。在此类型系统中,对象实例可以在运行时组合以形成新实例,同时保留各自的身份。

这段代码:

var p = new Person();
var pa = new Partner(p);

...产生单个组合对象,“p”和“pa”是其上不同的符合 OOP 的 View 。 IOW,更改其中一个 View 的属性值会立即反射(reflect)在也包含此属性的任何其他 View 上。

这一切都很好,但它缺少两个用于查询类型标识的关键 API。我真的很想能够编写这样的代码:

if (p is Partner)
{
(p as Partner).SomePartnerProperty = "...";
}

这当然行不通,因为“is”和“as”运算符的行为不能重载/扩展到 .NET 的 OOP 规则规定的范围之外。尽管如此,我的类型系统中仍然需要此功能。

我的第一个想法是使用将附加到我的类型系统的所有实例的通用扩展方法:

public static bool Is<T>(this BaseType target) where T : BaseType { ... }
public static T As<T>(this BaseType target) where T : BaseType { ... }

忽略不区分大小写的语言中的名称冲突问题,就功能而言,这似乎还可以:

if (p.Is<Partner>())
{
p.As<Partner>().SomePartnerProperty = "...";
}

但是,我忍不住想知道 - 这真的是人们能想到的最好、最方便的 API 吗?

您建议我如何实现这两个运算符,以便在应用程序代码中使用它们感觉自然?

更新:对于任何想知道这种类型系统用途的人...基本上,每种类型都属于两个类别之一:Identity角色。在我上面给出的例子中,Person 是一个身份(设计),而 Partner 是一个角色(同样,设计 - 它可以设计不同)。这种类型系统的基本规则是任意数量的角色可以由任何给定的身份组成,而身份本身只能由更高的身份组成(例如,一个人可以成为一个联系人,但永远不能成为一个公司)。这种类型系统使应用程序能够透明地处理例如合作伙伴对象,无论他们具有什么身份(例如个人、公司、银行等)。

最佳答案

我建议使用两个简单的函数。

第一个(至少对我而言)会很直观,名称如下:

p.IsType(typeHere)
p.IsPartner()

第二个是简单的 To-Call:

p.ToPartner()

我不会将它们实现为泛型(只是觉得不适合我),尤其是最后一个。

关于c# - 需要建议 : alternative to overloading "is" and "as" operators in . NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1783901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com