User98743 Ответов: 2

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


Может быть, я сегодня просто дурочка. Я не хочу продолжать вводить пространство имен и имя класса каждый раз, когда я вызываю этот класс:
namespace MyNamespace
{
    public class DataHelpers
	{
		public string SysnamePath ( string db , string schema , string table )
		{
			return "[ " + db + " ].[ " + schema + " ].[ " + table + " ]";
		}
    }
}

Можно ли это написать так, чтобы мне не приходилось постоянно набирать полный путь?..
dbpath = DataHelpers.SysnamePath(...);



Как я уже сказал, я уверен, что это что-то основное.

Что я уже пробовал:

Я пробовал делать это как метод расширения и вставлять его в свой вызывающий метод.

2 Ответов

Рейтинг:
12

Peter Vegter

Этот вариант не очень хорошо известен и, насколько мне известно, используется не очень часто:
сделайте свой класс DataHelpers/метод SysnamePath статическим, а затем используйте (в верхней части файла):

using static MyNamespace.DataHelpers;
после этого вы можете использовать только имя метода:
dbpath = SysnamePath(...);


[no name]

Я действительно узнал об этом с тех пор, как опубликовал этот вопрос. Другие говорят, что это тоже довольно редко, так что я предпочел бы придерживаться обычной практики. Я просто буду придерживаться метода экземпляра. Спасибо, Питер.

Peter Vegter

Пожалуйста. Я думаю, что где-то видел эту конструкцию как предложение от Microsoft, так что это может быть так плохо. Спасибо за ответ.

[no name]

Простите, вы хотели сказать "не может быть" так плохо или "может быть" так плохо? Мне просто интересно из-за контекста, и я хотел бы получить лучший ответ.

Peter Vegter

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

[no name]

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

Рейтинг:
1

David_Wimbley

Итак, во-первых, вам не нужно вводить пространство имен, так как это в конечном итоге будет оператор using в верхней части вашего кода.

Например, это должно быть допустимое использование для вашего формата.

using MyNameSpace;

namespace MyProgram
{
   public class Program
   {
      public void Main(string[] args)
      {
         var helper = new DataHelpers();
         helper.SysnamePath("");
      }
   }
}


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

namespace MyNamespace
{
    public static class DataHelpers
	{
		public static string SysnamePath ( string db , string schema , string table )
		{
			return "[ " + db + " ].[ " + schema + " ].[ " + table + " ]";
		}
    }
}


Однако ваш метод расширения должен ссылаться на переменную, которую он расширяет с помощью this ключевое слово. Так что ваш SysnamePath метод должен использовать 1 переменную с this ключевое слово.

Так что, может быть, вы бы реализовали его примерно так

namespace MyNamespace
{
    public static class DataHelpers
	{
		public static string SysnamePath ( this string db , string schema , string table )
		{
			return "[ " + db + " ].[ " + schema + " ].[ " + table + " ]";
		}
    }
}


Так что теперь ваше использование может выглядеть примерно так

using MyNameSpace;

namespace MyProgram
{
   public class Program
   {
      public void Main(string[] args)
      {
         var myDb = "Databasename";
         //SysnamePath is now an extension method for types of "string"
         myDb.SysnamePath("dbo", "my table name");
      }
   }
}


Я бы предостерег, что не расширяйте метод-анизинг всех вещей, так как это может быть трудно понять правильное использование, если они используются на общих типах, таких как string...in мое мнение, конечно.


[no name]

Здесь есть очень важные моменты. Мне следовало бы упомянуть, что я сразу же отказался от метода расширения. Чего мне не хватало, так это того, что я мог бы просто сделать его статическим методом. Не знаю, почему мне это не пришло в голову! Спасибо, что откликнулись!