Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
lurii
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 84
1

Хочется вызывать статические методы без префикса объекта

05.05.2006, 00:21. Просмотров 2034. Ответов 8
Метки нет (Все метки)

Технология ASP (С#).
Есть объект, у него много статичных методов.
Хочется вызывать их без префикса объекта как в JS:
Javascript
1
with (Math){  x = cos(3 * PI) + sin (LN10)    y = tan(14 * E)}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2006, 00:21
Ответы с готовыми решениями:

Как вызывать методы в C#?
Как вызвать метод а(), который содержит 4 аргумента? class Program { static void...

Можно ли в многопоточном приложении вызывать статические методы из разных потоков?
Можно ли в многопоточном приложении вызывать статические методы из разных потоков? То есть что мне...

Можно ли вызывать магические методы без выполнения условия?
На сколько мне известно магические методы будут вызваны неявно при определенных условиях. Так можно...

Используя статические объекты и статические методы, разработать программу движения по экрану прямой линии
Используя статические объекты и статические методы, разработать программу движения по экрану...

Используя статические объекты и статические методы, разработать программу движения по экрану прямой линии и квадрата.
Помогите, в решении задач, пожалуйста! 1. Используя статические объекты и статические методы,...

8
bazile
66 / 42 / 68
Регистрация: 15.03.2007
Сообщений: 6,909
05.05.2006, 13:41 2
В С# нет ключевого слова with или его аналога. Можно переписать этот кусок программы на VB или создать у себя в классе функции вроде
C#
1
2
3
4
private static Sin(double a)
{
return Math.Sin(a);
}
Таким образом ты сократишь запись. На производительность это не должно повлиять так как JIT-компилятор должен оптимизировать подобные вызовы.
0
lurii
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 84
05.05.2006, 16:54  [ТС] 3
Итак: ASP позволяет в скрипте определять функции (методы вне объекта).
C#
1
2
3
<script runat="server">
 public static string tostr(Object obj){return System.Convert.ToString(obj);}
</script>
И к ним очеть просто обращаться : a=tostr(param);
Со временем таковых накопилось куча и я решил переместить их в компилированную библиотеку(dll). Но определять там методы вне объекта не могу. И на странице тоже приходится вызывать их ссылаясь на объект:
<%@ import namespace="my_lib"%>
a=my_obj.my_function(param);
Вот и не хочу писАть через обращение к объекту - придется добавлять эту приставку во все вызовы методов.
0
bazile
66 / 42 / 68
Регистрация: 15.03.2007
Сообщений: 6,909
05.05.2006, 17:25 4
lurii (05.05.2006)
Итак: ASP позволяет в скрипте определять функции (методы вне объекта).
<script runat="server
public static string tostr(Object obj){return System.Convert.ToString(obj);}
</script>

И к ним очеть просто обращаться : a=tostr(param);
Подобные вставки кода автоматически компилируются средой ASP.NET внутрь временного класса, наследника от класса твоей страницы. Поэтому тебе только кажется что этот метод находится вне класса. В .NET Framework любой метод всегда находится внутри какого-нибудь класса. По другому просто не может быть.
При обращении к подобному методу не нужно указывать имя класса только потому что он находится в том же классе что и другой код твоей страницы.
lurii (05.05.2006)
Со временем таковых накопилось куча и я решил переместить их в компилированную библиотеку(dll). Но определять там методы вне объекта не могу. И на странице тоже приходится вызывать их ссылаясь на объект:
<%@ import namespace="my_lib"%>
a=my_obj.my_function(param);
Вот и не хочу писАть через обращение к объекту - придется добавлять эту приставку во все вызовы методов.
Если хочешь держать эти функции в отдельном классе, то без использования "приставки" не обойтись. Но ты можешь создать класс наследник от System.Web.UI.Page, добавить в него все нужные тебе функции и все новые классы страниц наследовать уже от этого класса.
0
lurii
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 84
06.05.2006, 05:12  [ТС] 5
А можно небольшой пример? В голове полный сумбур ...
0
bazile
66 / 42 / 68
Регистрация: 15.03.2007
Сообщений: 6,909
06.05.2006, 14:09 6
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class BasePage : System.Web.UI.Page
{
    public static void DoSomething1()
    {
        ...
    }
    
    public static string DoSomething2()
    {
        ...
    }
}
В другом файле
C#
1
2
3
4
5
6
7
8
9
public class MyPage : BasePage
{
    protected override void OnLoad(EventArgs e)
    {
        DoSomething1();
        ...
        string s = DoSomething2();
    }
}
0
lurii
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 84
06.05.2006, 17:56  [ТС] 7
Идею использования объекта - наследника базового понял.
Так и я делал одно время - наследовал все свои классы от базового (с набором статичных методов) - тогда да, вызов идет без префикса класса.
НО, я к сожалению большей частью не использую объекты, а только ф-ции, поэтому не отслеживаю события для страницы вроде OnLoad(EventArgs e), а вызываю только ф-ции.
Т.е. (вопреки идее ASP.NET) я вызываю свои ф-ции прямо на странице в тегах <%%> - на манер классического ASP. Проект был изначально написан на ASP - мне в короткие сроки пришлось переписать его на .NET. Так все и пошло.
А можно ли в System.Web.UI.Page добавить свои методы?
Или создать такой класс, который бы также подключался к странице как и System.Web.UI.Page?
0
bazile
66 / 42 / 68
Регистрация: 15.03.2007
Сообщений: 6,909
06.05.2006, 18:47 8
lurii (06.05.2006)
А можно ли в System.Web.UI.Page добавить свои методы?
Нельзя. Для этого бы понадобились исходные тексты .NET Framework Class Library и закрытый ключ Microsoft для подписи сборки. И если исходники можно получить тем же Reflector-ом, то закрытый ключ получить нет никакой возможности.
lurii (06.05.2006)
Или создать такой класс, который бы также подключался к странице как и System.Web.UI.Page?
А вот это возможно. Берешь класс BasePage из прошлого примера и регистрируешь его в файле web.config
Код
<pages pageBaseType="BasePage,my_lib" ... />
По сути ты просто заменяешь базовый класс для всех страниц на свой собственный. Предполагается что my_lib это название твоей сборки. Она должна лежать в каталоге bin веб-приложения и иметь имя my_lib.dll. Класс BasePage находится в корне этой сборки - в смысле не включен ни в какое пространство имен.
0
lurii
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 84
07.05.2006, 04:32  [ТС] 9
OK, спасибо за подсказку, попробую.
0
07.05.2006, 04:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2006, 04:32

Как правильно вызывать функцию объекта из другой функции того же объекта?
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на которую я наткнулся,...

Статические методы
Нужно помочь решить задания.

Статические методы
Доброго времени суток! Как можно написать метод void readLn(), который ждет нажатия enter,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru