扩展T的扩展方法 - 糟糕的做法?

Sea*_*man 21 c# generics extension-methods delegates func

我已经读过,扩展System.Object通常是不好的做法,我同意这一点.

但是,如果以下内容被认为是一种有用的扩展方法,或者它仍然是不好的做法,我很好奇吗?

它类似于扩展System.Object但不完全相同,

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

这实际上允许任何对象调用任何将该对象作为参数并返回R的函数,无论该函数是否属于该对象.我认为这可能有助于一些有趣的"控制反转",但总体上并不确定.

思考?

aqw*_*ert 2

嗯,这里确实有两点:

1)创建一个扩展方法以便this T将其应用于所有类型是否是一个好主意?

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

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

对于第二个,由于调用是立即的,因此语法的选择如下

    int res = other.InvokeFunc<Other, int>(Callback);

    var res2 = (new Func<Other, int>(Callback))(other);

    var res3 = Callback(other);
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,那么对传递实例的方法的简单调用更加自然和典型,但是如果您的扩展方法变得更加复杂,那么我回到我的第一点,它取决于上下文(这可能有助于封装) 。