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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# 4.0 ΠΏΠΎΠ»Π½ΠΎΠ΅ руководство - 2011Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 167

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

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° dynamic дСмонстрируСтся Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

// ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° dynamic, using System;

using System.Globalization;

class DynDemo {

static void Main() {

// ΠžΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π΄Π²Π΅ динамичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, dynamic str; dynamic val;

// ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ нСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² динамичСскиС Ρ‚ΠΈΠΏΡ‹.

// ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ присваивания Π²ΠΏΠΎΠ»Π½Π΅ допустимы, str = "Π­Ρ‚ΠΎ строка"; val = 10;

Console.WriteLine("ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ str содСрТит: " + str);

Console.WriteLine("ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ val содСрТит: " + val + '\n');

str = str.ToUpper (Culturelnfo.CurrentCulture);

Console.WriteLine("ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ str Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТит: " + str);

val = val + 2;

Console.WriteLine("ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ val Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТит: " + val + '\n');

string str2 = str.ToLower(Culturelnfo.CurrentCulture);

Console.WriteLine("ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ str2 содСрТит: " + str2);

// ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ нСявныС прСобразования ΠΈΠ· динамичСских Ρ‚ΠΈΠΏΠΎΠ².

int Ρ… = val * 2;

Console.WriteLine("ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ x содСрТит: " + x);

}

}

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ str содСрТит: Π­Ρ‚ΠΎ строка ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ val содСрТит: 10

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ str Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТит: ЭВО БВРОКА ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ val Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТит: 12

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ str2 содСрТит: это строка ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρ… содСрТит: 24

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π² этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ str ΠΈ val, ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅ΠΌΡ‹Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΈΠΏΠ° dynamic. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° соотвСтствиС Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с участиСм ΠΎΠ±Π΅ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π° Π²ΠΎ врСмя компиляции. Π’ ΠΈΡ‚ΠΎΠ³Π΅ для Π½ΠΈΡ… оказываСтся ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½ΠΎΠΉ любая опСрация. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ str Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ToUpper () ΠΈ ToLower () класса String, Π° пСрСмСнная участвуСт Π² опСрациях слоТСния ΠΈ умноТСния. И хотя всС пСрСчислСнныС Π²Ρ‹ΡˆΠ΅ дСйствия совмСстимы с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², присваиваСмых ΠΎΠ±Π΅ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π² рассматриваСмом здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, компилятору ΠΎΠ± этом Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ извСстно β€” ΠΎΠ½ просто ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚. И это, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ динамичСских ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€, хотя ΠΈ допускаСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ПоявлСния ошибок Π² ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… дСйствиях Π²ΠΎ врСмя выполнСния.

Π’ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΠΎΠΌ здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Π΅Π΄Π΅Ρ‚ сСбя "ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ" Π²ΠΎ врСмя выполнСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, присваиваСмыС упомянутым Π²Ρ‹ΡˆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ дСйствия, выполняСмыС Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π’ частности, ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ val присваиваСтся Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ поэтому ΠΎΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ цСлочислСнныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ слоТСниС. А ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ str присваиваСтся символьная строка, ΠΈ поэтому ΠΎΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ строковыС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° Ρ„Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСлаСтся ссылка, всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ° dynamic возлагаСтся Π½Π° самого ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π°Π²Π°Ρ€ΠΈΠΉΠ½Ρ‹ΠΌ сбоСм.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π° сСбя Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° dynamic ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присвоСн любой Ρ‚ΠΈΠΏ ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ благодаря нСявному ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡŽ любого Ρ‚ΠΈΠΏΠ° Π² Ρ‚ΠΈΠΏ dynamic. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚ΠΈΠΏ dynamic автоматичСски прСобразуСтся Π² любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ. РазумССтся, Ссли Π²ΠΎ врСмя выполнСния Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ окаТСтся Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ, Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ошибка

ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ. Π’Π°ΠΊ, Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ½Ρ†Π΅ рассматриваСмой здСсь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΊΠΎΠ΄Π°:

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 IsDivBy(int 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. Если Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ компилятором ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅.

Π”Π°Π»Π΅Π΅ ΡΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ примСняСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° 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];

//А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΉΡ‚ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ конструктор.

Constructorlnfo[] 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;

}

I

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса 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

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ сначала динамичСски загруТаСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° MyClass . dll, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ рСфлСксия для построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса DivBy. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ присваиваСтся Π΄Π°Π»Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ obj Ρ‚ΠΈΠΏΠ° dynamic. А Ρ€Π°Π· Ρ‚Π°ΠΊ, Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Is DivBy () ΠΈ IsEven () ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ obj ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π° Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Invoke (). Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это Π²ΠΏΠΎΠ»Π½Π΅ допустимо, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пСрСмСнная obj Π½Π° самом Π΄Π΅Π»Π΅ ссылаСтся Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса DivBy. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ Π±Ρ‹ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сильно ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ ΠΈ нСсколько Π½Π°Π΄ΡƒΠΌΠ°Π½. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ½ наглядно ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π³Π»Π°Π²Π½ΠΎΠ΅ прСимущСство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΄Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ dynamic Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΈΠΏΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ Π²ΠΎ врСмя выполнСния. Когда характСристики искомого Ρ‚ΠΈΠΏΠ°, Π² Ρ‚ΠΎΠΌ числС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, поля ΠΈ свойства, Π·Π°Ρ€Π°Π½Π΅Π΅ извСстны, эти характСристики ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΈΠΏΠ° dynamic, ΠΊΠ°ΠΊ слСдуСт ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Благодаря этому ΠΊΠΎΠ΄ становится ΠΏΡ€ΠΎΡ‰Π΅, ΠΊΠΎΡ€ΠΎΡ‡Π΅ ΠΈ понятнСС.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ Ρ‚ΠΈΠΏ dynamic, слСдуСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚ΠΈΠΏ dynamic фактичСски замСняСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, Π° для описания Π΅Π³ΠΎ примСнСния Π²ΠΎ врСмя выполнСния прСдоставляСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ информация. И ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏ dynamic компилируСтся Π² Ρ‚ΠΈΠΏ object для Ρ†Π΅Π»Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ, Ρ‚ΠΎ ΠΎΠ±Π° Ρ‚ΠΈΠΏΠ° dynamic ΠΈ object Ρ€Π°ΡΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ компиляции Π΄Π²ΡƒΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка.