Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ПолноС руководство. Π‘# 4.0Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 154

Автор Π¨ΠΈΠ»Π΄Ρ‚ Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚

bool b = val;Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΈΠ·-Π·Π° отсутствия нСявного прСобразования Ρ‚ΠΈΠΏΠ°int (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ оказываСтся Ρ‚ΠΈΠΏΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ val Π²ΠΎ врСмя выполнСния) Π² Ρ‚ΠΈΠΏ bool.ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ данная строка ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, хотя ΠΎΠ½Π° ΠΈ будСтскомпилирована Π±Π΅Π·ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ.ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΏΠΎΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π½Π΅ΠΉ. Π’ частности, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… str ΠΈ val Π½Π° object, Π° Π·Π°Ρ‚Π΅ΠΌΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π΅Ρ‰Π΅ Ρ€Π°Π·. Π’ ΠΈΡ‚ΠΎΠ³Π΅ появятся ошибки ΠΏΡ€ΠΈ компиляции, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏ object Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ дСйствия, выполняСмыС Π½Π°Π΄ ΠΎΠ±Π΅ΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π²ΠΎ врСмя компиляции. Π’ этом, собствСнно,ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ основноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² object ΠΈ dynamic. НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠ±Π°Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π½Π°Π΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° object ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡΡ‚ΠΈΠΏΠΎΠΌ object. Если ΠΆΠ΅ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‚ΠΈΠΏ dynamic, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅ угоднодСйствиС, ΠΏΡ€ΠΈ условии Ρ‡Ρ‚ΠΎ это дСйствиС поддСрТиваСтся ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСлаСтся ссылка Π²ΠΎ врСмя выполнСния.Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ стало понятно, насколько Ρ‚ΠΈΠΏ dynamic способСн ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, рассмотрим простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΅Π³ΠΎ примСнСния вмСстС с рСфлСксиСй. Как пояснялось Π² Π³Π»Π°Π²Π΅ 17, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎΠ²ΠΎ врСмя выполнСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСфлСксии, ΠΌΠΎΠΆΠ½ΠΎ, Π² частности, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄ΡƒInvoke(). И хотя Ρ‚Π°ΠΊΠΎΠΉ способ оказываСтся Π²ΠΏΠΎΠ»Π½Π΅ работоспособным, Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Π΅Π³ΠΎ имя извСстно. НапримСр,Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° такая ситуация, ΠΊΠΎΠ³Π΄Π° Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ сборкС содСрТится конкрСтныйкласс, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΈΠΌΠ΅Π½Π° ΠΈ дСйствия ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Ρ€Π°Π½Π΅Π΅ извСстны. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эта сборка ΠΏΠΎΠ΄Π²Π΅Ρ€ΠΆΠ΅Π½Π° измСнСниям, Ρ‚ΠΎ приходится постоянно ΡƒΠ±Π΅ΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ,Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ послСдняя Π΅Π΅ вСрсия. Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии сборки ΠΌΠΎΠΆΠ½ΠΎ,Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ рСфлСксиСй, ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ искомого класса, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² этом классС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΠΎΠΈΠΌΠ΅Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΈΠΏΠ° dynamic, Π° Π½Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Invoke(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ… ΠΈΠΌΠ΅Π½Π° извСстны.РазмСститС сначала ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ Π² Ρ„Π°ΠΉΠ»Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ MyClass.cs. Π­Ρ‚ΠΎΡ‚ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ посрСдством рСфлСксии.

public class DivBy { public bool IsDivBylint a, int b) { if((a % b) == 0) return true; return false; }public bool IsEven(int a) { if((a % 2) == 0) return true; return false;}

}Π—Π°Ρ‚Π΅ΠΌ скомпилируйтС этот Ρ„Π°ΠΉΠ» Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ DLL ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ MyClass.dll.Если Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ компилятором ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡ‚Ρ€ΠΎΠΊΠ΅ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.

csc /t:library MyClass.csΠ”Π°Π»Π΅Π΅ ΡΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ примСняСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° MyClass.dll, ΠΊΠ°ΠΊΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ dynamic вмСстС с рСфлСксиСй.using System;using System.Reflection;

class DynRefDemo { static void Main() { Assembly asm = Assembly.LoadFrom("MyClass.dll"); Type[] all = asm.GetTypes(); // Найти класс DivBy. int i; for(i = 0; i < all.Length; i++) if(all[i].Name == "DivBy") break; if(i == all.Length) { Console.WriteLine("Класс DivBy Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ Π² сборкС."); return; } Type t = all[i]; //А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΉΡ‚ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ конструктор. ConstructorInfΠΎ[] ci = t.GetConstructors(); int j; for(j = 0; j < ci.Length; j++) if(ci[j].GetParameters().Length == 0) break; if(j == ci.Length) { Console.WriteLine("Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ конструктор Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½."); return; } // Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса DivBy динамичСски. dynamic obj = ci[j].Invoke (null); // Π”Π°Π»Π΅Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ obj. Π­Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ допустимо, // ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пСрСмСнная obj относится ΠΊ Ρ‚ΠΈΠΏΡƒ dynamic, Π° Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² // ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ Π½Π° соотвСтствиС Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎ врСмя выполнСния, Π° Π½Π΅ компиляции. if(obj.IsDivBy(15, 3)) Console.WriteLine("15 дСлится Π½Π°Ρ†Π΅Π»ΠΎ Π½Π° 3."); else Console.WriteLine("15 HE дСлится Π½Π°Ρ†Π΅Π»ΠΎ Π½Π° 3."); if(obj.IsEven(9)) Console.WriteLine("9 Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число."); else Console.WriteLine("9 HE Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ число.");}

}Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ сначала динамичСски загруТаСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°MyClass.dll, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ рСфлСксия для построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса DivBy.ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ присваиваСтся Π΄Π°Π»Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ obj Ρ‚ΠΈΠΏΠ° dynamic. А Ρ€Π°Π· Ρ‚Π°ΠΊ,Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ IsDivBy() ΠΈ IsEven() ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ obj ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ,Π° Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Invoke(). Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Π²ΠΏΠΎΠ»Π½Π΅ допустимо, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пСрСмСнная obj Π½Π° самом Π΄Π΅Π»Π΅ ссылаСтся Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса DivBy. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ Π±Ρ‹ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ.ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сильно ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ ΠΈ нСсколько Π½Π°Π΄ΡƒΠΌΠ°Π½. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ оннаглядно ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π³Π»Π°Π²Π½ΠΎΠ΅ прСимущСство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ dynamic Π² Ρ‚Π΅Ρ… случаях,ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя выполнСния. Когда характСристики искомого Ρ‚ΠΈΠΏΠ°,Π² Ρ‚ΠΎΠΌ числС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, поля ΠΈ свойства, Π·Π°Ρ€Π°Π½Π΅Π΅ извСстны, эти характСристики ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΈΠΏΠ° dynamic, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Благодаря этому ΠΊΠΎΠ΄ становится ΠΏΡ€ΠΎΡ‰Π΅, ΠΊΠΎΡ€ΠΎΡ‡Π΅ ΠΈ понятнСС.ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ Ρ‚ΠΈΠΏ dynamic, слСдуСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚ΠΈΠΏ dynamic фактичСски замСняСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π° для описания Π΅Π³ΠΎ примСнСния воврСмя выполнСния прСдоставляСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ информация. И ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏdynamic компилируСтся Π² Ρ‚ΠΈΠΏ object для Ρ†Π΅Π»Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ, Ρ‚ΠΎ ΠΎΠ±Π° Ρ‚ΠΈΠΏΠ° dynamicΠΈ object Ρ€Π°ΡΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ компиляции Π΄Π²ΡƒΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ…ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка.

static void f(object v) { // ... }static void f(dynamic v) { // ... } // Ошибка!И послСднСС Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ρ‚ΠΈΠΏ dynamic поддСрТиваСтся ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ DLR (DynamicLanguage Runtime β€” БрСдство создания динамичСских языков Π²ΠΎ врСмя выполнСния),Π²Π½Π΅Π΄Ρ€Π΅Π½Π½Ρ‹ΠΌ Π² .NET 4.0.## Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ взаимодСйствия с модСлью Π‘ΠžΠœΠ’ вСрсии C# 4.0 Π²Π½Π΅Π΄Ρ€Π΅Π½Ρ‹ срСдства, ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ взаимодСйствияс нСуправляСмым ΠΊΠΎΠ΄ΠΎΠΌ, опрСдСляСмым модСлью ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² (БОМ)ΠΈ примСняСмым, Π² частности, Π² COM-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Office Automation. НСкоторыС ΠΈΠ· этихсрСдств, Π² Ρ‚ΠΎΠΌ числС Ρ‚ΠΈΠΏ dynamic, ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свойства, пригодныдля примСнСния ΠΏΠΎΠΌΠΈΠΌΠΎ возмоТности взаимодСйствия с модСлью БОМ. Π’Π΅ΠΌΠ° модСлиБОМ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈ COM-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Office Automation Π² частности вСсьма ΠΎΠ±ΡˆΠΈΡ€Π½Π°, Π° ΠΏΠΎΡ€ΠΎΠΉ идовольно слоТна, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Π΅Π΅ Π² этой ΠΊΠ½ΠΈΠ³Π΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ взаимодСйствия с модСлью БОМ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΈ.Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π΄Π²Π΅ особСнности, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ возмоТности взаимодСйствия с модСлью БОМ, Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ³ΠΎ рассмотрСния Π² этом Ρ€Π°Π·Π΄Π΅Π»Π΅. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈΠ·Π½ΠΈΡ… состоит Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ индСксированных свойств, Π° вторая β€” Π² возмоТности ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ значСния Ρ‚Π΅ΠΌ COM-ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ трСбуСтся ссылка.Как Π²Π°ΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΆΠ΅ извСстно, Π² C# свойство ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ связываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΈΠΌΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· аксСссоров get ΠΈΠ»ΠΈ set. Но совсСм ΠΈΠ½Π°Ρ‡Π΅ Π΄Π΅Π»ΠΎ обстоит со свойствами ΠΌΠΎΠ΄Π΅Π»ΠΈ БОМ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, начиная с вСрсии C# 4.0, Π² качСствС Π²Ρ‹Ρ…ΠΎΠ΄Π° изэтого Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ полоТСния Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ с COM-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ появилась Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ индСксированным свойством для доступа ΠΊ COM-свойству, ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΌΡƒ нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π‘ этой Ρ†Π΅Π»ΡŒΡŽ имя свойства индСксируСтся, ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ это дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ индСксатора. Допустим, Ρ‡Ρ‚ΠΎ имССтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ myXLApp,ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ относится ΠΊ Ρ‚ΠΈΠΏΡƒ Microsoft.Office.Interop.Execl.Application.Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ для установки строкового значСния "OК" Π² ячСйках Π‘1-Π‘Π— элСктроннойтаблицы Excel ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ.

myXLapp.get_Range("C1", "Π‘3").set_Value(Type.Missing, "OK");Π’ этой строкС ΠΊΠΎΠ΄Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ячССк элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ получаСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌΠ΅Ρ‚ΠΎΠ΄Π° get_Range(), для Ρ‡Π΅Π³ΠΎ достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ† ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π°. А значСния Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° set_Value(), для Ρ‡Π΅Π³ΠΎ достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ (Ρ‡Ρ‚ΠΎΠ½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ) ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ этих ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ свойства Range ΠΈValue, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ ΠΎΠ±ΠΎΠΈΡ… свойств ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ ΠΊ нимнСльзя Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΊ свойствам, Π½ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹ΠΌΠΈΠ²Ρ‹ΡˆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Type.Missing слуТил Π² качСствС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ заполнитСля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдавался для указания Π½Π° Ρ‚ΠΈΠΏ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.Но, начиная с вСрсии C# 4.0, появилась Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, привСдя Π΅Π³ΠΎ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅.