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); }
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; }
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); } }
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(); }
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) }
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(); }
protected override void CreateDelegate(string funName) { ValueCalculate = (ValueDelegate)Delegate.CreateDelegate(typeof(ValueDelegate), this, funName); }
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; }