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的函数,无论该函数是否属于该对象.我认为这可能有助于一些有趣的"控制反转",但总体上并不确定.
思考?
嗯,这里确实有两点:
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)
考虑到这一点,那么对传递实例的方法的简单调用更加自然和典型,但是如果您的扩展方法变得更加复杂,那么我回到我的第一点,它取决于上下文(这可能有助于封装) 。