C# 扩展T-bad实践的扩展方法?

C# 扩展T-bad实践的扩展方法?,c#,generics,delegates,extension-methods,func,C#,Generics,Delegates,Extension Methods,Func,我读到过,扩展System.Object通常是一种不好的做法,对此我表示赞同 然而,我很好奇,下面的方法是否会被认为是一种有用的扩展方法,或者它仍然是一种糟糕的做法 它类似于扩展System.Object,但不完全相同 public static R InvokeFunc<T, R>(this T input, Func<T, R> func) { return func.Invoke(input); } public stati

我读到过,扩展System.Object通常是一种不好的做法,对此我表示赞同

然而,我很好奇,下面的方法是否会被认为是一种有用的扩展方法,或者它仍然是一种糟糕的做法

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

    public static R InvokeFunc<T, R>(this T input, Func<T, R> func)
    {
        return func.Invoke(input);
    }
public static R InvokeFunc(此T输入,Func Func)
{
返回函数调用(输入);
}
这本质上允许任何对象调用将该对象作为参数并返回R的任何函数,无论该函数是否属于该对象。我认为这可能会促进一些有趣的“控制反转”,但总体上不确定


想法?

所有这些功能都是让您能够将一个方法作为参数引用,实际上,它已经允许您在C#中使用

在你的情况下,我不认为它比
Func
类型的委托更有用(在IoC的情况下)。这只是调用它的另一种方式

更新

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

public static Func<R> InvokeFunc<T, R>(this T input, Func<T, R> func)
{
    return () => func(input);
}
public static Func InvokeFunc(此T输入,Func Func)
{
返回()=>func(输入);
}

这里有两点:

1) 使用
这个T
创建一个扩展方法是否是一个好主意,这样它将应用于所有类型

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

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

对于第二种情况,由于调用是即时的,因此语法的选择如下

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

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

    var res3 = Callback(other);
int res=other.InvokeFunc(回调);
var res2=(新函数(回调))(其他);
var res3=回调(其他);

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

FYI您不必说“func.Invoke(input)”。你可以省略“.Invoke”这个词。你有没有关于这个用法的例子?必须在一个非泛型类->Intereting中定义一个扩展方法compiles@lukas它编译是因为类本身不是泛型的-方法是泛型的。这两个泛型参数都在方法上声明。@lukas看一看linq/iqueryable扩展方法,都是泛型的,您一直在使用它:)这是真的。它确实使调用在语法上更加简单。我更愿意说,它使委托的创建更加简单,当您已经有委托时,调用语法实际上会变得更长:“x(y)”指向“y.InvokeFunc(x)”