扩展T的扩展方法——不好的做法

本文关键字:扩展 方法 | 更新日期: 2023-09-27 17:50:10

我读到过扩展System通常是不好的做法。反对,我同意。

我很好奇,然而,如果以下将被认为是一个有用的扩展方法,或者它仍然是坏的做法?

它类似于扩展System。对象,但不完全是

    public static R InvokeFunc<T, R>(this T input, Func<T, R> func)
    {
        return func.Invoke(input);
    }

本质上允许任何对象调用任何以该对象为形参并返回R的函数,无论该函数是否属于该对象。我认为这可能会促进一些有趣的"控制反转",但我不确定它的整体效果。

想法吗?

扩展T的扩展方法——不好的做法

这里有两点:

1)用this T创建一个扩展方法,使其适用于所有类型,这是否是个好主意?

2)所描述的特定扩展方法是否有用?

第一个问题的答案是有时,但取决于上下文。您可以让扩展方法应用于所有类,就像linq所做的那样,确保您选择合适的名称空间。我认为在System命名空间中创建这种类型的扩展方法是一个坏主意,但如果它更有针对性,那么它可能会很有用。

对于第二个,由于调用是直接的,所以语法的选择如下

    int res = other.InvokeFunc<Other, int>(Callback);
    var res2 = (new Func<Other, int>(Callback))(other);
    var res3 = Callback(other);

看看,然后一个简单的调用传递实例的方法是更自然和典型的,但是如果你的扩展方法变得更复杂,那么我回到我的第一点,它取决于上下文(这可以帮助封装)。

所做的就是让你能够将方法作为参数来引用,这实际上是c#中委托已经允许的。

在您的例子中,我不认为它比Func<T,R>类型的委托更有用(在IoC的情况下)。这只是调用它的另一种方式。

正如评论中提到的,我认为这种方法只会帮助您更有效地创建委托。但无论哪种方式,您都不会再使用已创建的委托,因为您立即调用了它。所以像这样的扩展方法对我来说更有意义:

public static Func<R> InvokeFunc<T, R>(this T input, Func<T, R> func)
{
    return () => func(input);
}