Exemple #1
0
        static void Main(string[] args)
        {
            Random rand = new Random();

            ValueDelegate[] ValueDelegates = new ValueDelegate[6];
            for (int i = 0; i < ValueDelegates.Length; i++)
            {
                ValueDelegates[i] = () => rand.Next(0, 10);
            }

            SrArithmetic srArithmetic = delegate(ValueDelegate[] valueDelegates)
            {
                int sum = 0;
                for (int i = 0; i < valueDelegates.Length; i++)
                {
                    sum += valueDelegates[i]();
                }
                return((double)sum / valueDelegates.Length);
            };

            double result = srArithmetic(ValueDelegates);



            Console.WriteLine(result);
        }
Exemple #2
0
        public void Precache()
        {
            Type          type   = typeof(CallModel);
            DynamicMethod method = new DynamicMethod("GetString", typeof(string), new Type[] { type });
            ILGenerator   il     = method.GetILGenerator();

            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldfld, type.GetField("Age"));
            il.Emit(OpCodes.Ret);
            EmitGetString = (Func <CallModel, string>)(method.CreateDelegate(typeof(Func <CallModel, string>)));


            method = new DynamicMethod("GetDateTime", typeof(DateTime), new Type[] { type });
            il     = method.GetILGenerator();
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldfld, type.GetField("CreateTime"));
            il.Emit(OpCodes.Ret);
            EmitGetDateTime = (Func <CallModel, DateTime>)(method.CreateDelegate(typeof(Func <CallModel, DateTime>)));


            method = new DynamicMethod("SetDateString", null, new Type[] { type, typeof(string) });
            il     = method.GetILGenerator();
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Stfld, type.GetField("Age"));
            il.Emit(OpCodes.Ret);
            EmitSetString = (Action <CallModel, string>)(method.CreateDelegate(typeof(Action <CallModel, string>)));


            method = new DynamicMethod("SetDateTime", null, new Type[] { type, typeof(DateTime) });
            il     = method.GetILGenerator();
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Stfld, type.GetField("CreateTime"));
            il.Emit(OpCodes.Ret);
            EmitSetDateTime = (Action <CallModel, DateTime>)(method.CreateDelegate(typeof(Action <CallModel, DateTime>)));


            NatashaGetString = NFunc <CallModel, string> .Delegate("return arg.Age;");

            NatashaGetString(OriginModel);
            OriginGetString = item => item.Age;


            NatashaGetDateTime = NFunc <CallModel, DateTime> .Delegate("return arg.CreateTime;");

            NatashaGetDateTime(OriginModel);
            OriginGetDateTime = item => item.CreateTime;


            NatashaSetString = NAction <CallModel, string> .Delegate("arg1.Age=arg2;");

            NatashaSetString(OriginModel, OriginModel.Age);
            OriginSetString = (item, value) => item.Age = value;

            NatashaSetDateTime = DelegateOperator <ValueDelegate> .Delegate("model.CreateTime=value;");

            NatashaSetDateTime(OriginModel, OriginModel.CreateTime);
            OriginSetDateTime = OriginDateTime;
        }
Exemple #3
0
        static void Main(string[] args)
        {
            MyDelegate myDelegate = Method1;

            myDelegate += Method4;
            myDelegate(); // вызывает Method1

            MyDelegate myDelegate2 = new MyDelegate(Method4);

            myDelegate2 += Method4;
            myDelegate2 -= Method4;
            myDelegate2.Invoke();

            MyDelegate myDelegate3 = myDelegate + myDelegate2;

            myDelegate3.Invoke();

            var valueDelegate = new ValueDelegate(MethodValue);

            valueDelegate += MethodValue;
            valueDelegate += MethodValue;
            valueDelegate += MethodValue;
            valueDelegate += MethodValue;
            valueDelegate((new Random()).Next(10, 50));

            Action action = Method1; //Делегат, который не возвращает значения.

            action();

            Predicate <int> predicate;

            Func <int, string> func;

            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            MyDelegate myDelegate = TestMethod;

            myDelegate += SecondMethod;
            myDelegate();

            MyDelegate seconDelegate = new MyDelegate(SecondMethod);

            seconDelegate.Invoke();

            seconDelegate -= seconDelegate;                       // delete method from delegate

            MyDelegate testdelegate = myDelegate + seconDelegate; // two delegate in one

            testdelegate.Invoke();

            var valueDelegate = new ValueDelegate(ValueMethod);

            valueDelegate += ValueMethod; // return last resold
            valueDelegate(new Random().Next(10, 50));

            Action <int> action = VoidValueMethod; // 0 - 16 arguments

            Predicate <int> predicate;             // return bool

            Func <string, double, int> func;       //1-16 argument. the last arg is return type(int or any other)

            Console.ReadLine();
        }
        public delegate void MyDelegate();        //задали сигнатуру делагат мож содержать набор метод один сигнатуры!

        //шаблон делегаты



        static void Main(string[] args)
        {
            #region delegate
            MyDelegate myDelegate = Method1;
            myDelegate += Method4;
            myDelegate();//один раз вызвав делегат обра к 2 методам
            Console.WriteLine();
            MyDelegate myDelegate2 = new MyDelegate(Method1);
            myDelegate2 += Method1;                            //добавили метод
            myDelegate2 -= Method1;                            //удалили
            myDelegate2.Invoke();                              //другой способ но первый лучше и проще
            Console.WriteLine();
            MyDelegate myDelegate3 = myDelegate + myDelegate2; //создали нов делег с объуд 1 и 2
            myDelegate3.Invoke();
            Console.WriteLine();
            ValueDelegate valueDelegate = new ValueDelegate(MethodValue);
            valueDelegate += MethodValue;
            valueDelegate((new Random()).Next(10, 50));//перед случ знач от 10 до 50 но перед во все методы!
            Console.WriteLine();

            Action action = Method1;//когда void и пуст скобки это action (это заготовка делагата)это синт сахар
            //может быть перегруж мож прин от 0 до 16 аргум!!!указ можем любые типы
            action += Method1;
            action();
            Console.WriteLine();
            Action <int> action2 = Method3;
            action2(5);
            Console.WriteLine();
            Predicate <int> predicate = Pred;//возвр bool и прин аргумент!мож задавать динамич
            predicate(5);
            Predicate <string> pred = PredS;
            pred("test");
            Console.WriteLine();
            Func <string, string, int> func; //от 1 до 16 типов тип возвр знач послед задается
            func = fun;
            func("hello", "world");          //но надо проверять что б небыло null!!!!
            #endregion

            #region event

            Person person = new Person();
            person.Name       = "Вася";
            person.DoWork    += Person_DoWork;
            person.GoToSleep += Person_GoToSleep;
            person.TakeTime(10);
            person.TakeTime(2);
            #endregion
        }
 public bool Init <T>(T target) where T : MonoBehaviour
 {
     if (target == null)
     {
         return(false);
     }
     if (!string.IsNullOrEmpty(m_ConditionMethod))
     {
         m_CondtionDelegate = (ValueDelegate <bool>)System.Delegate.CreateDelegate(typeof(ValueDelegate <bool>), target, m_ConditionMethod);
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemple #7
0
        public delegate int ValueDelegate(int i);  // объявляем делегат

        static void Main(string[] args)
        {
            // 1-ый способ присвоения и вызова делегата

            MyDelegate myDelegate = Method1; // присваеваем делегату имя метода1

            myDelegate();                    // делегат вызывает метод1
            Console.WriteLine("==========");
            myDelegate += Method4;           // добавляем к делегату еще один метод !!!
            myDelegate += Method1;           // добавляем еще один метод. Делегат вызывает 3 метода сразу последовательно
            myDelegate();
            Console.WriteLine("==========");

            // 2-ой способ вызова и присвоения делегата

            MyDelegate myDelegate2 = new MyDelegate(Method1); // вызов конструктора и в качестве параметра передаем имя метода1

            myDelegate2 += Method4;                           // добавляем к делегату еще один метод4
            myDelegate2.Invoke();
            Console.WriteLine("==========");
            myDelegate2 -= Method4; // удаляем из делегата метод4
            myDelegate2.Invoke();
            Console.WriteLine("==========");
            myDelegate2 = myDelegate + myDelegate2; // к делегату2 добавляем еще один делегат1
            myDelegate2.Invoke();                   // вызываем делегат который вызывает метод1
            Console.WriteLine("==========");

            // 3-ий пример вызова и присвоения делегата

            var valueDelegate = new ValueDelegate(ValueMethod);

            valueDelegate += ValueMethod;  // одно число будет передано во все эти методы ниже!!!
            valueDelegate += ValueMethod;
            valueDelegate += ValueMethod;
            valueDelegate += ValueMethod;

            valueDelegate((new Random()).Next(1000)); // вызываем делегат и передаем в него рандомное число
            Console.WriteLine("==========");
            valueDelegate(13);                        // присваеваем 13 методу ValueMethod через вызов делегат


            Console.ReadLine();
        }
Exemple #8
0
        static void Main(string[] args)
        {
            //1 way
            MyDelegate myDelegate = Method1;

            myDelegate += Method4;
            myDelegate();

            //2 way
            MyDelegate myDelegate1 = new MyDelegate(Method4);

            myDelegate1.Invoke();

            MyDelegate myDelegate3 = new MyDelegate(myDelegate + myDelegate1);
            //myDelegate3.Invoke();


            var valueDelegate = new ValueDelegate(MethodValue);

            valueDelegate += MethodValue;
            valueDelegate += MethodValue;
            valueDelegate += MethodValue;
            valueDelegate += MethodValue; //вызовится много раз, но возвратит последнее

            valueDelegate((new Random().Next(10, 50)));



            //шаблонные делегаты
            Action action = Method1; //ничего не возвращает, принимает от 0 до 16и аргументов

            action();

            Predicate <int> predicate;

            predicate = Method2;

            Func <int, string> func; //public delegate int Func(string value)
        }
Exemple #9
0
        static void Main(string[] args)
        {
            MyDelegate myDelegate = Method1;

            myDelegate += Method4;
            myDelegate();

            MyDelegate myDelegate2 = new MyDelegate(Method4);

            myDelegate2 += Method4;
            myDelegate2 -= Method4;
            myDelegate2.Invoke();

            MyDelegate myDelegate3 = myDelegate + myDelegate2;

            myDelegate3.Invoke();

            var valuedelegate = new ValueDelegate(MethodValue);

            valuedelegate += MethodValue;
            valuedelegate += MethodValue;
            valuedelegate += MethodValue;
            valuedelegate += MethodValue;

            valuedelegate(new Random().Next(10, 50));

            Action action = Method1;

            action();

            Predicate <int> predicate;

            Func <string, int> func;

            Console.ReadLine();
        }
Exemple #10
0
 protected override void CreateDelegate(string funName)
 {
     ValueCalculate = (ValueDelegate)Delegate.CreateDelegate(typeof(ValueDelegate), this, funName);
 }
Exemple #11
0
        public delegate int ValueDelegate(int i);// делегат с аргументом(параметром)


        static void Main(string[] args)
        {
            MyDelegate myDelegate = Method1;// определили переменную делегата и присваиваем имя метода

            // теперь мы можем вызывать делегат, вызывая Method1(дергая делегат, мы дергаем Method1)
            // Делегат -это указатель на метод(контейнер в который складываются ссылки на методы)
            // Делегат является коллекцией - содержащей набор методов одинаковой сигнатуры
            // Один раз обращаясь к делегату, мы обращаемся ко всем добавленных в него методам
            myDelegate += Method4; // добавление метода в делегат
            myDelegate();          // вызов делегата, который в свою очередб вызывает метод(ы) на которые от указывает
            Console.WriteLine("-----------------------------------------");
            //альтернативный вызов делегата и добавления в него метода
            //один и тот же метод может быть добавлен в делегат несколько раз
            MyDelegate myDelegate1 = new MyDelegate(Method4); // в делегат добавили Method4

            myDelegate1 += Method4;                           // добавляет в делегает еще раз Method4
            myDelegate1 -= Method4;                           //удаление из делегаета  Method4
            myDelegate1.Invoke();
            Console.WriteLine("-----------------------------------------");
            MyDelegate myDelegate2 = myDelegate + myDelegate1;// создаем новый делегат, который объединяет два других

            myDelegate2.Invoke();
            Console.WriteLine("-----------------------------------------");
            // если делегат будет содержать несколько методов возвращающих значения, из делегата будет возвращено последнее значение метода(т.к методы помещаются в делегат последовательно)
            var valueDelegate = new ValueDelegate(Method2);

            // случайное число от 10 до 50 будет передано во все методы делегата, но возвращено только последнее
            valueDelegate += Method2;                   //17
            valueDelegate += Method2;                   //17
            valueDelegate += Method2;                   //17
            valueDelegate += Method2;                   // значение будет возвращено только от этого(если например здесь число 17 то и в других методах будет 17)
            valueDelegate((new Random()).Next(10, 50)); // передаем в делегат случайное значение от 10 до 50
            Console.WriteLine("-----------------------------------------");
            // шаблонный делегат(не возращает значения)
            // по сигнатуре полностью совпадает с  public delegate void MyDelegate();
            // Action - это заготовка делегата
            //public delegate void Action(); можно не объявлять вручную, а сразу обращаться по имени Action(он уже по умолчанию создан)
            //Action - это делегат который не возвращает значения, но может принимать от 0 до 16 аргументов(параметров)
            Action actionDelegate = Method1;

            // если хотим сделать  Action с аргументом(параметром), то мы указываем тип
            //public delegate void Action(int i);
            //Action<int> actionDelegate = Method1;// не возвращает ни одного значения, но принимает один параметр
            //public delegate void Action(int i, int j, string H);
            //Action<int, int, string> actionDelegate = Method1;// не возвращает ни одного значения, но принимает три параметра
            actionDelegate();
            Console.WriteLine("-----------------------------------------");
            //public delegate bool Predicate<T>(T value)
            //Делегат Predicate<T>, как правило, используется для сравнения, сопоставления некоторого объекта T определенному условию.
            //В качестве выходного результата возвращается значение true, если условие соблюдено, и false, если не соблюдено
            //public delegate bool Predicate(int value) используется уже сокращенная форма как ниже
            Predicate <int> predicate = Method5;

            predicate(5);
            Console.WriteLine("-----------------------------------------");
            Predicate <int> isPositive = delegate(int x) { return(x > 0); };

            Console.WriteLine(isPositive(20));
            Console.WriteLine(isPositive(-20));
            Console.WriteLine("-----------------------------------------");

            //public delegate int Func(); ниже сокращенная форма по умолчанию, может не принимать параметров, а может до 16
            // Func в любом случае возвращает какое-то значение
            Func <int> func;
            //public delegate int Func(string value); ниже сокращенная форма по умолчанию
            // последним параметром задается возвращаемый тип
            Func <string, int> func1;
            //public delegate int Func(string str, char c); ниже сокращенная форма по умолчанию
            Func <string, char, int> func2;

            Func <int, int> func3 = Method2;

            // 2 строчки ниже можно сократить
            //if(func3!=null) // проверка есть ли в нем какие-то методы
            //func3(7);
            func3?.Invoke(7);


            Console.ReadLine();
        }
 public ValueShaderProperty(string name = null, ValueDelegate valueGenerator = null)
 {
     Name           = name;
     ValueGenerator = valueGenerator;
 }
 public void Add <TValueType> (ValueDelegate par) where TValueType : class
 {
     InvokerMap [typeof(TValueType)] = par;
 }
 public WaitTask(ValueDelegate <bool> isdone)
 {
     IsDoneHandler = isdone;
 }