21

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

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

它类似于扩展 System.Object 但不完全一样,

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

这实质上允许任何对象调用任何将该对象作为参数并返回 R 的函数,无论该函数是否属于该对象。我认为这可以促进一些有趣的“控制反转”,但总体上不确定。

想法?

4

2 回答 2

2

那么这里真的有两点:

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);

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

于 2011-04-15T00:50:21.460 回答
1

所有这一切都是为了让您能够将方法作为参数引用,这实际上是委托在 C# 中已经允许您使用的。

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

更新

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

public static Func<R> InvokeFunc<T, R>(this T input, Func<T, R> func)
{
    return () => func(input);
}
于 2011-04-14T23:03:42.347 回答