Метод расширения с использованием объекта Instantiated, т.е. String.F () - PullRequest
1 голос
/ 15 сентября 2011

В предыдущей организации мы реализовали метод расширения, который создал сокращение для String.Format. Метод был назван «String.F». Однако я не могу заставить это работать. Бывший сотрудник дал мне следующий код, который я перечисляю ниже вместе с моим собственным методом тестирования. В функции «Test ()» «String.F» выдает ошибку и не отображается в значении. Я бы спросил, если это невозможно, но я написал код, используя вызов этого метода. Это возможно только при использовании инстанцированной строки? Спасибо.

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 ]

6 голосов
/ 15 сентября 2011

Вы не можете использовать метод расширения и использовать его в статическом контексте. Методы расширения могут использоваться только как методы экземпляра.

Вы можете сделать

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

и используйте его вот так

"test:{0}".F("test");
1 голос
/ 15 сентября 2011

Я думаю, что проблема в том, что вы вызываете String.F, когда класс, которому принадлежит метод, является MyExtensions;не String ... если вы хотите вызвать его таким образом, это должен быть MyExtensions.F ("test {0}", "test")

Как уже упоминали другие, хотя это совершенно верноПохоже, что он обходит стороной то, что отличает методы расширения.

Выполнение "test {0}". F ("test");должен давать тот же результат, что и MyExtensions.F ("test {0}", "test");Если F не был установлен как метод расширения, только последний подход будет действительным.

...