扩展T的扩展方法-不好的做法?

| 我已经读到,扩展System.Object通常是不好的做法,我确实同意。 但是,我很好奇,如果下面的方法被认为是有用的扩展方法,还是不好的做法? 它类似于扩展System.Object,但不完全相同,
    public static R InvokeFunc<T, R>(this T input, Func<T, R> func)
    {
        return func.Invoke(input);
    }
本质上,这允许任何对象调用将该对象作为参数并返回R的任何函数,无论该函数是否属于该对象。我认为这可以促进一些有趣的“控制反转”,但总体上不确定。 有什么想法吗?     
已邀请:
好吧,这里确实有两点: 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#中允许您这样做。 在您的情况下,我认为它(在IoC的情况下)比类型为
Func<T,R>
的委托有用。这只是调用它的另一种方法。 更新 如评论中所述,我认为此方法仅有助于您更有效地创建委托。但是,无论哪种方式,您都不会再使用创建的委托,因为您立即调用了它。因此,这样的扩展方法对我来说更有意义:
public static Func<R> InvokeFunc<T, R>(this T input, Func<T, R> func)
{
    return () => func(input);
}
    

要回复问题请先登录注册