动态装饰c#中的对象

Ore*_*zor 10 c# decorator

是否可以轻松动态地装饰对象?

例如,假设我有一个List<PointF>.这个列表实际上是正弦函数的图.我想通过这些观点为每个PointF添加一个标志,告知它是否为峰值.

但我不想创建一个新的扩展SpecialPointF或其他什么,它有一个布尔属性.

判断我想要懒惰的一切,但懒惰是多么出色的想法诞生(也是坏主意)

编辑:我会接受拳击解决方案以及你可以提出的任何有趣的黑客.没有什么可以阻止我的衍生.我只是想知道是否有更有趣的方式.

Ada*_*son 5

不,没有办法(具体地)你所要求的.

假设您正在使用C#3.0+,您可以使用匿名类型来执行此操作,假设您不希望在函数之外公开信息.

var decoratedList = sourceList.Select(pt => new 
                    { 
                        IsPeak = GetIsPeak(pt), 
                        Point = pt 
                    }).ToList();
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个新List<T>对象.这很可能无法解决您的问题,因为您无法在单个函数调用之外扩展它,并且您正在创建列表而不是修改现有列表,但希望这会有所帮助.


Fra*_*oto 4

如果有一种方法可以计算每个点,则不需要向其添加标志,您可以使用扩展方法而无需扩展它。

\n

类似于 PointF.isPeak();

\n

它的工作原理类似于:

\n
public static class Extensions\n{\n    public static bool isPeak (this PointF p)\n    {\n        do crazy math...\n\n        return result;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

瞧\xc3\xa0,你在 PointF 类中进行了计算。

\n

顺便说一句,公共静态类必须位于最外层范围,不能嵌套。

\n