我正在尝试找出一种自动将某些内容转换为 Action 或 Func 的方法,我能想到的最好的方法是这样的:
[TestFixture]
public class ExecutionTest
{
public void BadMethod()
{
throw new Exception("Something bad happened");
}
[Test]
public void TestBadMethod()
{
// Want this, but it won't work!!
// BadMethod.Execute().IgnoreExceptions();
// Ick
((Action)BadMethod).Exec().IgnoreExceptions();
// Still ick
((Action)BadMethod).IgnoreExceptions();
// Do not want
ExtensionMethods.Exec(BadMethod).IgnoreExceptions();
// Better but still meh
this.Exec(BadMethod).IgnoreExceptions();
}
}
public static class ExtensionMethods
{
public static Action Exec(this Action action)
{ return action; }
public static Action Exec(this object obj, Action action)
{ return action; }
public static void IgnoreExceptions(this Action action)
{
try { action(); }
catch {}
}
}
必须有一种更好/更简单的方法来做到这一点,有什么想法吗?
在 C# 中,当您使用不带括号的方法名称时,它称为方法组,并且除了编译时之外没有任何表示形式。一个方法组可以表示多个方法(由于重载和覆盖),因此为了隐式标识需要哪个方法,必须提供目标委托类型。
在您的情况下,您想知道为什么扩展方法参数类型不会触发函数的解析。简单地说,扩展是在类型已知后才进行评估的,即 this 参数不能用作隐式转换目标。
为什么它会损坏的示例:
class Test
{
void M (void) // Fits Action delegate
{
}
int M (int) // Fits Func<int,int> delegate
{
return 5;
}
void Test()
{
M.Exec(); // UHOH!!! Which Exec to resolve to ???
}
}
public static class Extensions
{
public static void Exec(this Action action) { }
public static void Exec(this Func<int, int> func) { }
}
正如您所看到的,存在冲突,但事实上,冲突永远不会发生,因为 C# 甚至不会尝试查找与方法组匹配的扩展。
请注意这也不起作用:
class A
{
public static implicit operator int (A a)
{
return 5;
}
void F()
{
A a = new A();
a.Blah(); // Error! It won't implicitly try C.Blah()
}
}
public static class C
{
public static void Blah (int i)
{
}
}
C# 不匹配A
to C.Blah(int)
因为它需要隐式转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)