ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

23.02.2009, 01:26
|
|
Участник форума
Регистрация: 25.08.2008
Сообщений: 187
Провел на форуме: 2066562
Репутация:
86
|
|
Вот, сделал!! в архиве(ifolder) проект(пример) 
З.Ы. удачи в создании игрушки)
|
|
|

25.03.2009, 21:47
|
|
Познавший АНТИЧАТ
Регистрация: 01.06.2008
Сообщений: 1,047
Провел на форуме: 5321514
Репутация:
3313
|
|
Есть класс A и класс B(причем классов может быть неограниченное кол-во).
В контроллер приходит имя из InputBox'a - "A".
Мне требуется создать экземпляр класса по его имени(без if и switch).
Это реально как-то организовать в рантайме? Если да, то как?
|
|
|

26.03.2009, 05:47
|
|
Постоянный
Регистрация: 05.07.2008
Сообщений: 555
Провел на форуме: 3134311
Репутация:
1467
|
|
Сообщение от Chaak
Есть класс A и класс B(причем классов может быть неограниченное кол-во).
В контроллер приходит имя из InputBox'a - "A".
Мне требуется создать экземпляр класса по его имени(без if и switch).
Это реально как-то организовать в рантайме? Если да, то как?
Мм. Если нужна помощь, то изложи вопрос нормальным языком. Лучше всего - покажи исходный текст задачи.
А то "Есть класс A и класс B(причем классов может быть неограниченное кол-во)" - какая-то палата ;6.
|
|
|

26.03.2009, 10:52
|
|
Reservists Of Antichat - Level 6
Регистрация: 23.05.2008
Сообщений: 756
Провел на форуме: 9257858
Репутация:
979
|
|
Сообщение от KaZ@NoVa
Мм. Если нужна помощь, то изложи вопрос нормальным языком. Лучше всего - покажи исходный текст задачи.
А то "Есть класс A и класс B(причем классов может быть неограниченное кол-во)" - какая-то палата ;6.
Всё вполне понятно.
|
|
|

26.03.2009, 04:44
|
|
Флудер
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме: 6490435
Репутация:
2290
|
|
Это реально как-то организовать в рантайме? Если да, то как?
Конечно.
Type.GetType("ConsoleApplication1.Test").GetConstr uctor(System.Type.EmptyTypes).Invoke(null);
|
|
|

26.03.2009, 10:13
|
|
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме: 3578578
Репутация:
275
|
|
https://forum.antichat.ru/showpost.php?p=1190575&postcount=2578
Это что интересно?
|
|
|

28.03.2009, 00:54
|
|
Познающий
Регистрация: 02.02.2007
Сообщений: 78
Провел на форуме: 1514596
Репутация:
49
|
|
Пожалуйста растолкуйте понятным языком, что такое делегаты?зачем они нужны в реальных проектах?
|
|
|

30.03.2009, 15:43
|
|
Постоянный
Регистрация: 07.06.2006
Сообщений: 556
Провел на форуме: 7549607
Репутация:
2702
|
|
Делегат - это попросту говоря ссылка на метод, но в тоже время он ведёт себя как тип (сразу скажу, что без понимания ООП понять суть делегатов будет сложно).
Делегаты - основа событий в C#. Без них не обходится ни одна нормальная программа.
допустим, имеется метод:
public void MethodToCall(Type1 agr1, Type2 arg2) { }
И, когда ты пишешь
someObj.SomeAction += new SomeDelegateType(MethodToCall)
ты говоришь компилятору, что при событии SomeAction должен выполниться метод MethodToCall().
Как я говорил, делегат - прежде всего тип, который мы обязаны объявить:
public delegate void SomeDelegateType(Type1 agr1, Type2 arg2);
При этом набор аргументов и их типов является неким подобием интерфейса (то есть наш метод MethodToCall должен принимать такие же аргументы). Отсюда следует вывод, что перегруженные методы не могут ссылаться на делегат одного и того же типа.
Также делегаты можно вызывать из разных потоков, что очень помогает при разработке многопоточных программ. но об это позже...
Последний раз редактировалось [x26]VOLAND; 30.03.2009 в 15:48..
|
|
|

01.04.2009, 15:05
|
|
Banned
Регистрация: 22.12.2007
Сообщений: 660
Провел на форуме: 3885269
Репутация:
1158
|
|
Немного дополню:
Делегат содержит 2 поля:
1. Ссылка на объект.
2. указатель на метод.
Если 1ое поле равно null, метод должен быть статистичеким.
Постараюсь ответить на вопрос MaDfUn
зачем они нужны в реальных проектах?
Если ты проектируешь спамер или флудер для школьников, то впринципе делегаты тебе не нужны. А если ты проектируешь opensource прилолжение, выполняешь важный заказ или просто хочешь чтобы твой код смотрелся красиво нужно использовать делегаты и события. Хотя с .net 2.0 есть еще анонимные методы, а с 3его уже можно использовать лямбда выражения, которые еще больше упрощают процесс понимания сего и проектирования.
Повторю слова Трэй Нэша "В хорошо спроектированной системе, узер интерфейс отделен от логики управления посредством четкой абстрации - обычно реализуемой через шаблон Мост".
Вообще видов делегатов бывают много (обобщеный делегат, делегат закрытого экземпляра, открытого экземпляра, статический делегат, цепочка делегатов).
Вкратце о каждом:
1. Делегат закрытого экземпляра:
Код:
using System;
namespace test
{
//создаем делегат
// public - модификатор доступа
// delegate - делагат )
// int - возвращаемое значение
// RaiseReputation - тип делегата
// int - параметры принимающие методом
public delegate double RaiseReputation(double reputation);
public class AntichatUser
{
//Конструктор объекта
public AntichatUser(double reputation)
{
this.reputation = reputation;
}
/// <summary>
/// поднять на %
/// </summary>
/// <param name="percent"></param>
/// <returns></returns>
public double ApplyRaiseOf(double percent)
{
reputation = reputation * (1 + percent);
Console.WriteLine("reputation: {0}", reputation);
return reputation;
}
// Репутация
private double reputation;
}
public class EntryPoint
{
static void Main()
{
// Создаем экземпляры классов
AntichatUser user1 = new AntichatUser(180);
AntichatUser user2 = new AntichatUser(600);
AntichatUser user3 = new AntichatUser(920);
// создаем экземпляры делегата!!!
RaiseReputation thisDelegate1 = new RaiseReputation(user1.ApplyRaiseOf);
RaiseReputation thisDelegate2 = new RaiseReputation(user2.ApplyRaiseOf);
RaiseReputation thisDelegate3 = new RaiseReputation(user3.ApplyRaiseOf);
//Увеличиваем значение свойства объекта на 80% и выводим результат на консоль
Console.WriteLine(thisDelegate1(0.8));
Console.WriteLine(thisDelegate1(0.8));
// а этому на 60% #-)
Console.WriteLine(thisDelegate1(0.6));
//ожидаем активности пользователя
Console.ReadKey();
}
}
}
В самом начале тут, мы создаем делегат, в комментариях описано думаю подробно. Далее мы создаем класс и метод в классе с которым будут работать экземпляры делегатов. Далее все в Main() думаю подробно описано. Единтсвенное что можно добавить это то что мы инициируем вызов метода, методом thisDelegate1(0.8), который в свою очередь принимает параметры точно такого же типа или типа не явно конвертирующегося в тип принимаемый методом ApplyRaiseOf(). Точно так же, экземпляр делегата после этого возвращает нам параметры.
Почему закрытого? Потому что каждый раз делегат выполняется только для экземпляра того класса, который мы указали в параметрах при вызове методы RaiseReputation.
Главное запомнить, что когда мы используем делегат вызывающий метод экземпляра объекта, мы передаем ему так же и текущий экземпляр объекта. Об этом позже, чтоб не вводить тебя в заблуждения.
2. делегат открытого экземпляра
А что если у нас не 3 объекта по отдельности, а 10 в коллекции?
Именно для таких нужд и созданы делегаты открытого типа.
Код:
using System;
namespace test
{
//создаем делегат
// public - модификатор доступа
// delegate - делагат )
// int - возвращаемое значение
// RaiseReputation - тип делегата
// int - параметры принимающие методом
public delegate double RaiseReputation(AntichatUser user, double reputation);
public class AntichatUser
{
//Конструктор объекта
public AntichatUser(double reputation)
{
this.reputation = reputation;
}
/// <summary>
/// поднять на %
/// </summary>
/// <param name="percent"></param>
/// <returns></returns>
public double ApplyRaiseOf(double percent)
{
reputation *= (1 + percent);
Console.WriteLine("reputation: {0}", reputation);
return reputation;
}
// Репутация
private double reputation;
}
public class EntryPoint
{
static void Main()
{
// Создаем коллекцию и помещаем туда экземпляры
System.Collections.Generic.List<AntichatUser> users =
new System.Collections.Generic.List<AntichatUser>();
users.Add(new AntichatUser(100));
users.Add(new AntichatUser(590));
users.Add(new AntichatUser(980));
// Итак, тут немного дуаю будет сложно разобратся, - помогу.
// Мы создаем экземпляр MethodInfo
// далее мы безопасно получаем тип класса AntichatUser
// (то же что и Type type = new Type(тра ля ля);
// Далее вызываем метод GetMethod() первым параметром
// которого является название метода, вторым это
// прявязки так называемые. На основе которых будет подбираться метод
// Public и Instance в данном случае значит что все pulic члены так же должны быть включены.
System.Reflection.MethodInfo info =
typeof(AntichatUser).GetMethod("ApplyRaiseOf",
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
// Тут создание экземпляра делегата, мы доверяем методу CreateDelegate()
RaiseReputation iAmDelegate =
(RaiseReputation)Delegate.CreateDelegate(typeof(RaiseReputation), info);
//Повышаем всем на 80% репутацию.
foreach (AntichatUser user in users)
iAmDelegate(user, 0.8);
//ожидаем активности пользователя
Console.ReadKey();
}
}
}
В комментариях все подробно описано.
3. Статически делегат.
Тоже самое что делегат закрытого типа. Только метод который стоит в указателе делагата на объект, является статистическим. т.е. 1ое поле у него null, а второе ссылка на *статистический* метод.
4. Обобщенный делегат, в точности такой же как делегат закрытого типа. За исключением того что он работает с обобщенными типами <T>.
пример:
Код:
public delegate double RaiseReputation<T>(<T> reputation);
Если мы не хотим поймать экскепшн, мы должны в нашем методе это предусмотреть.
Думаю такая логика идиоту понятна, поэтому демонстрировать не буду)
------
Но я бы тебе пососветовал не останавливатся на делегатах и взглянуть на события.
|
|
|

02.04.2009, 02:00
|
|
Постоянный
Регистрация: 07.06.2006
Сообщений: 556
Провел на форуме: 7549607
Репутация:
2702
|
|
foreach (AntichatUser user in users)
iAmDelegate(user, 0.8);
Помоему вот так:
[I]for (int i = 0; i < users.Count; iAmDelegate(users , 0.8));
быстрее и красивее )
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|