gpt4 book ai didi

c# - 如何利用 C# 属性和反射在标记对象上注入(inject)/强制后期绑定(bind)?

转载 作者:行者123 更新时间:2023-11-30 15:45:14 25 4
gpt4 key购买 nike

我喜欢设计模式,问题是有些模式实现起来真的很乏味。例如,装饰一个有 20 多个成员的对象就很烦人。

因此,我想创建一个很好的设计模式库以应用于类(作为基类或属性),以便更快、更轻松地实现这些模式。

问题是......我不太确定从哪里开始 - 因为我对属性和反射大多不熟悉。


我想利用属性来标记单例(类似于导出标记)、多例和装饰器……如果可能的话。但我什至不知道从哪里开始才能创建一个改变其实例功能的单例属性。

我有限的研究让我相信通过属性使用反射/后期绑定(bind)并获得对程序集中所有标记类的访问权限,可以让你拼凑出一个单例......但我仍然不完全确定那将如何完成。

我发现的一个框架,叫做 Ninject 1.0,创建了一个 Singleton 属性 - 但是该库非常广泛且没有文档记录,我目前无法理解它的逻辑。


我觉得具有这种功能的库会对那里的许多开发人员做出巨大贡献。因此,如果有人可以提供一些示例代码让我指出正确的方向来创建这些模式之一作为属性——其代码并不过分涉及,我将不胜感激。或者,如果有人愿意引导我完成 Ninject 的单例属性实现,那么我可能会解决这个问题......

感谢您的时间和考虑。

最佳答案

我认为您对设计模式的含义有点困惑。

模式实际上是一种常用的做事方式,旨在解决特定问题

您并不是真的为了模式而使用模式。更多模式的使用并不自动意味着好的。您使用模式来解决类型问题 —— 希望该模式是解决该问题的公认最佳实践方法。不要试图将模式应用于您的代码,因为您可以

现在,在这一切之后,确实可以看出您打算做的并不是实现模式的正确方法。您不会用属性等标记代码,然后将它们称为模式。模式您的代码。您的代码模式。例如,除非它真正实现了发布/订阅功能,否则您不会在类上标记发布者/订阅者模式。例如,你不把一个类标记为“Singleton”,然后它就变成了单例模式;使用单例模式需要您围绕该设计编写您的程序(和您的类)。

但是,您可以使用某些属性标记代码或类,这些属性可以帮助检查代码/类是否符合特定模式。

例如,您可以实现一个遍历所有类的类型检查器,检查是否有任何标记为“publisher”的内容,并查看该类是否实现了“IPublisher”接口(interface)。或者您的类型检查器可以检查是否有任何类被标记为“单例”,构造函数是否允许在任何时候构造多个实例。

但是属性和反射通常不是实现模式的工具。

在没有多重继承的 C# 中,您实现模式的方式有时只是通过基类。例如,您可以通过声明一个“SingletonObject”基类来实现“单例”模式,该基类将自身限制为只有一个实例。然后你从这个基类派生任何你想成为单例的类。例如,您可以通过声明 IPublisher 和 ISubscriber 接口(interface)来实现“发布/订阅”模式。

现在,如果您真的只想在 C# 类上使用 Decorator 模式(根据您的问题的标题),您正在寻找的是一个自动包装对象生成器。您可以将包装器基于 ExpandoObject,循环遍历基础对象的属性,然后将属性添加到 ExpandoObject,后者只需委托(delegate)回基础对象。然后将新属性添加到基础对象之上的 ExpandoObject。瞧!您将获得自动装饰器模式包装器类生成器。

关于c# - 如何利用 C# 属性和反射在标记对象上注入(inject)/强制后期绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5400818/

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