我已经读过扩展System.Object通常是不好的做法,我同意这一点。
但是,如果以下内容被视为有用的扩展方法,或者它仍然是不好的做法,我很好奇吗?
它类似于扩展System.Object但不完全是
public static R InvokeFunc<T, R>(this T input, Func<T, R> func)
{
return func.Invoke(input);
}
这实质上允许任何对象调用将该对象作为参数并返回R的任何函数,无论该函数是否属于该对象。我认为这可能有助于一些有趣的“控制反转”,但总体上并不确定。
思想?
答案 0 :(得分: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);
然后看一下对传递实例的方法的简单调用是更自然和典型的,但是如果你的扩展方法变得更加复杂,那么我回到我的第一点,它取决于上下文(这可能有帮助封装)。
答案 1 :(得分:1)
所有这一切都是因为它使您能够将方法作为参数引用,实际上{C}已经允许您使用delegates。
我认为在你的情况下,它比Func<T,R>
类型的委托更有用(在IoC的情况下)。这只是调用它的另一种方式。
<强>更新强>
正如评论中所提到的,我认为这种方法只能帮助您更有效地创建委托。但无论哪种方式,您都不会再使用创建的委托,因为您立即调用它。所以像这样的扩展方法对我来说更有意义:
public static Func<R> InvokeFunc<T, R>(this T input, Func<T, R> func)
{
return () => func(input);
}