使用非实例化对象的扩展方法,即String.F()

时间:2011-09-15 12:55:57

标签: c# .net extension-methods

在之前的组织中,我们实现了一个扩展方法,该方法为String.Format创建了一个简写。该方法称为“String.F”。但是我似乎无法让这个工作。一位前同事给了我以下代码,我将在下面列出我自己的测试方法。在函数'Test()'中,“String.F”抛出并出错,并且不会在intellisence中显示。我会问这是不可能的,但是我已经使用对此方法的调用来编写代码。这只是在使用实例化字符串时才有可能吗?感谢。

public static class MyExtensions {
    public static string F(this string target, params object[] args) {
        return "hello";
    }
}

class TestExtensions {
    public string Test() {
        return String.F("test:{0}", "test");
    }
}

2 个答案:

答案 0 :(得分:6)

您无法执行扩展方法并在静态上下文中使用它。扩展方法只能用作实例方法。

你可以做到

public static string F(this string target, params object[] args) {
        return String.Format(target, args);
}

并像这样使用

"test:{0}".F("test");

答案 1 :(得分:1)

我认为问题是你在调用String.F时,拥有该方法的类是MyExtensions; not String ...如果你想这样调用它,它应该是MyExtensions.F(“test {0}”,“test”)

正如其他人所提到的那样,尽管这是完全有效的,但它似乎正在回避使扩展方法与众不同的事情。

做“测试{0}”。F(“测试”);应该给出与MyExtensions.F相同的结果(“test {0}”,“test”);如果F未设置为扩展方法,则只有后一种方法才有效。