импортировать статический метод

Как импортировать статический метод из другого исходного файла C# и использовать его без «точек»?

как :

foo.cs

namespace foo
{
    public static class bar
    {
        public static void foobar()
        {
        }
    }
}

Program.cs

using foo.bar.foobar; <= can't!

namespace Program
{
    class Program
    {
        static void Main(string[] args)
        {
             foobar();
        }
    }
}

Я не могу просто foobar (); , но если я напишу с помощью foo; вверху и вызовите foobar() как foo.bar.foobar() работает, несмотря на многословность. Какие-нибудь обходные пути?

13
добавлено отредактировано
Просмотры: 1
Java поддерживает импорт статических методов. Просто говорю... :)
добавлено автор Esteban Araya, источник
написано bar.foobar() так многословно?
добавлено автор Felice Pollano, источник
Вы можете изменить принятый ответ - у этого вопроса есть достаточно большое количество просмотров, чтобы время от времени обновляться.
добавлено автор Peter Aron Zentai, источник
Если вы пишете с помощью foo; , то bar.foobar() - это все, что вам нужно вызвать. С помощью статического метода вы всегда будете иметь хотя бы одну точку.
добавлено автор Paul Phillips, источник
переключиться на VB.Net? «Модуль» в VB делает «трюк» - вид дань уважения пользователям VB.classic.
добавлено автор igrimpe, источник

4 ответы

С C# 6.0 вы можете.

C# 6.0 allows static import (See using Static Member)

Вы сможете:

using static foo.bar;

а затем в вашем Main методе, который вы можете сделать:

static void Main(string[] args)
{
    foobar();
}

Вы можете сделать то же самое с System.Console , как:

using System;
using static System.Console;
namespace SomeTestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Test Message");
            WriteLine("Test Message with Class name");
        }
   }
}

EDIT: с момента выпуска Visual Studio 2015 CTP в январе 2015 года функция статического импорта требует явного упоминания ключевого слова static , например:

using static System.Console;
25
добавлено

Это принятый ответ, но обратите внимание, что, как говорится ниже, теперь это возможно в C# 6

Вы не можете

статические методы должны быть в классе по дизайну ..

Почему статические методы необходимо обернуть в класс?

8
добавлено

Объявите переменную Action Delegate в подходящей области следующим образом и используйте это позже:

Action foobar =() => foo.bar.foobar();

или даже проще

Action foobar = foo.bar.foobar;

Я также обращу внимание на методы расширения (руководство по программированию на C #) , Если у вас есть методы с параметрами, часто бывает довольно уютно:

public static class bar
{
    public static void foobar(this string value)
    {
    }
}

и использовать его:

 string s = "some value";
 s.foobar();

Это на самом деле гораздо лучший подход.

1
добавлено
Никогда не знал, что есть ключевое слово «Действие». однако это означает, что я должен объявить Action ... для каждой функции в статическом классе, который я хочу использовать ...
добавлено автор thkang, источник
@thkang это не ключевое слово. Это делегат. См. Делегат действий
добавлено автор horgh, источник
@PaulPhillips Я думаю, вы должны объяснить свой комментарий более подробно
добавлено автор horgh, источник
@PaulPhillips Я никогда не говорил «заменить все». Хотя в некоторых случаях умеренное использование этого может улучшить читаемость кода.
добавлено автор horgh, источник
@PaulPhillips пропустил это. Определенно соглашаюсь с вами.
добавлено автор horgh, источник
@phoog Спасибо! Отредактированный мой ответ, чтобы отразить ваш комментарий
добавлено автор horgh, источник
Действие foobar = foo.bar.foobar; будет немного более легким, не говоря уже о более подробном.
добавлено автор phoog, источник
Действие не является ключевым словом, это тип. Это умный ответ, но please на самом деле его не используют.
добавлено автор Paul Phillips, источник
@KonstantinVasilcov Где они сказали: «Я должен объявить действие для каждой функции в статическом классе», дал мне озноб. Это довольно требовательно иметь «нет точек» и просто скрывать, что, вероятно, является более сложной проблемой дизайна. Я представил себе открытие метода, который использовал этот трюк в 5-10 различных статических функциях, и я бы не хотел наследовать этот код.
добавлено автор Paul Phillips, источник
@ Константин Васильков. Нет, вы этого не сделали, но thkang сделал. На это я и отвечал.
добавлено автор Paul Phillips, источник

Чтобы добавить к ответам уже здесь, важно отметить, что C# - очень типизированный язык. Поэтому, если метод не существует в классе, в котором вы находитесь, вы никогда не сможете сделать что-то вроде того, что ищете.

Однако, если вы добавите использование:

using foo;

Затем вы можете получить доступ к нему только с типом и методом, подобным этому:

bar.foo();
0
добавлено