{"id":281618,"date":"2016-11-27T18:55:03","date_gmt":"2016-11-27T15:55:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=281618"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=281618","title":{"rendered":"\u041b\u0435\u043d\u044c, \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0431\u043e\u0440\u043a\u0438"},"content":{"rendered":"<h4>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u044b\u0442, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043b\u0435\u043d\u0438<\/h4>\n<p>  \u0413\u043e\u0434\u0430 \u0442\u0440\u0438 \u043d\u0430\u0437\u0430\u0434, \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u0444\u0438\u0440\u043c\u0443. \u0411\u044b\u043b\u043e \u043d\u0430\u0441 4 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430. \u041e\u0434\u0438\u043d \u043f\u0438\u0441\u0430\u043b \u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u043e\u043d \u0435\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 (interface). \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0432\u044f\u0437\u0438, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0442. \u0434. \u041d\u0430\u0448\u0430 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441 GUI. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0432\u044f\u0437\u0435\u0439 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c.<\/p>\n<p>  \u042f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0435\u043d\u0438\u0432\u044b\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u0430 \u043c\u044b\u0441\u043b\u044c \u2014 \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f, \u043a\u0430\u043a \u043d\u0438\u0431\u0443\u0434\u044c \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0418 \u044f \u0441\u0435\u043b \u0437\u0430 \u043a\u043d\u0438\u0436\u043a\u0438.<\/p>\n<p>  <b>\u0428\u0430\u0433 \u043f\u0435\u0440\u0432\u044b\u0439<\/b><\/p>\n<p>  \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0434\u0435\u044f \u0431\u044b\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430 \u044f\u0432\u043d\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u0430. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u2014 \u0442\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0438\u0445 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0444\u0430\u0439\u043b \u0441\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c. \u0422\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0442\u0435\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u043e\u0441\u044c, \u043d\u043e \u0435\u0441\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433, \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c(\u043a\u043b\u0430\u0441\u0441\u044b \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445)<\/b><\/p>\n<div class=\"spoiler_text\"><a name=\"habracut\"><\/a>  <\/p>\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; using SV.DataBaseWork; using v2; using System.Data.SqlClient; namespace CreatorDBClasses {     class ColumnDB     {         public ColumnDB(string name, string type)         {             Name = name;             Type = ConvertType(type);         }         public string Name;         public string Type;         public string Initial = &quot;null&quot;;         public string ConvertType(string tp)         {             switch (tp)             {                 case &quot;String&quot;:                     Initial = &quot;\\&quot;\\&quot;&quot;;                     return &quot;string&quot;;                 case &quot;Double&quot;:                     Initial = &quot;0&quot;;                     return &quot;double&quot;;                 case &quot;Boolean&quot;:                     Initial = &quot;false&quot;;                     return &quot;bool&quot;;                 case &quot;Int32&quot;:                     Initial = &quot;0&quot;;                     return &quot;int&quot;;                 default:                     Initial = &quot;null&quot;;                     return tp;             }         }     }     \/\/\/ &lt;summary&gt;     \/\/\/ \u0421\u0432\u043e\u0434\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f CreatorDBWorkClasses     \/\/\/ &lt;\/summary&gt;     public class CreatorClasses     {         String connStr = null;         public CreatorClasses(string table, String ConnectionString = null)         {             tablename = table;             className = &quot;cl_&quot; + tablename;             if (string.IsNullOrEmpty(ConnectionString))                 connStr = v2_SacuraConstants.ConnectionString;             else                 connStr = ConnectionString;             \/\/             \/\/ TODO: \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043b\u043e\u0433\u0438\u043a\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430             \/\/         }         string mBaseClass = &quot;DataBaseWorkBase&quot;;         public string BaseClass         {             get { return mBaseClass; }             set { mBaseClass = value; }         }          string tab = &quot;\\t\\t&quot;;         string className;         string sources;         public string Sources         {             get { return sources; }         }         string tablename;         List&lt;ColumnDB&gt; mListColumn = new List&lt;ColumnDB&gt;();         public bool GetSources()         {             sources = &quot;\\tpublic class &quot; + className + (string.IsNullOrEmpty(BaseClass) ? &quot;&quot; : &quot; : &quot; + BaseClass) + &quot;, IDisposable\\r\\n\\t{\\r\\n&quot;;             sources += GetConstructor();             sources += GetProperty();             sources += GetInitFunction();             sources += GetSaveFunction();             sources += GetDeleteFunction();             sources += GetDisposable();             sources += StaticGetList();             sources += GetLastError();             sources += &quot;\\t}&quot;;             return true;         }         string GetLastError()         {             return &quot;#region Error\\r\\n&quot; +                 &quot;        string mError;\\r\\n&quot; +                 &quot;        public string lastError\\r\\n&quot; +                 &quot;        {\\r\\n&quot; +                 &quot;            get { return mError; }\\r\\n&quot; +                 &quot;        }\\r\\n&quot; +                 &quot;#endregion\\r\\n&quot;;         }         string StaticGetList()         {             return &quot;#region Static_GetList\\r\\n&quot; +                    &quot;     public static List&lt;&quot;+className+&quot;&gt; GetList(string SQL_WHERE = \\&quot;\\&quot;)\\r\\n&quot; +                    &quot;     {\\r\\n&quot; +                    &quot;         List&lt;&quot; + className + &quot;&gt; lst = null;\\r\\n&quot; +                    &quot;         DataBaseWorkBase db = new DataBaseWorkBase(v2_SacuraConstants.ConnectionString);\\r\\n&quot; +                    &quot;         if (db.Open())\\r\\n&quot; +                    &quot;         {\\r\\n&quot; +                    &quot;             lst = new List&lt;&quot; + className + &quot;&gt;();\\r\\n&quot; +                    &quot;             SqlCommand sqlcmd = db.CreateSQLCommand();\\r\\n&quot; +                    &quot;             sqlcmd.CommandText = \\&quot;SELECT * \\&quot; +\\r\\n&quot; +                    &quot;                 \\&quot;FROM &quot;+tablename+&quot; \\&quot; + SQL_WHERE;\\r\\n&quot; +                    &quot;             SqlDataReader reader = sqlcmd.ExecuteReader();\\r\\n&quot; +                    &quot;             while (reader.Read())\\r\\n&quot; +                    &quot;             {\\r\\n&quot; +                    &quot;                 &quot; + className + &quot; ord = new &quot; + className + &quot;();\\r\\n&quot; +                    &quot;                 if (ord.InitFromDataReader(reader))\\r\\n&quot; +                    &quot;                     lst.Add(ord);\\r\\n&quot; +                    &quot;             }\\r\\n&quot; +                    &quot;             reader.Close();\\r\\n&quot; +                    &quot;             reader = null;\\r\\n&quot; +                    &quot;         }\\r\\n&quot; +                    &quot;         db.Close();\\r\\n&quot; +                    &quot;         db = null;\\r\\n&quot; +                    &quot;         return lst;\\r\\n&quot; +                    &quot;     }\\r\\n&quot; +                 &quot;#endregion\\r\\n&quot;;         }         string GetDisposable()         {             return &quot;#region \u0427\u043b\u0435\u043d\u044b IDisposable\\r\\n&quot; +                    &quot;     public override void Close()\\r\\n&quot; +                    &quot;     {\\r\\n&quot; +                    &quot;         base.Close();\\r\\n&quot; +                    &quot;     }\\r\\n&quot; +                    &quot;\\r\\n&quot; +                    &quot;    protected override void Dispose(bool disposing)\\r\\n&quot; +                    &quot;    {\\r\\n&quot; +                    &quot;        if (disposing)\\r\\n&quot; +                    &quot;        {\\r\\n&quot;+                    &quot;            Close();\\r\\n&quot; +                    &quot;            base.Dispose(true);\\r\\n&quot; +                    &quot;        }\\r\\n&quot; +                    &quot;    }\\r\\n&quot; +                                      &quot;#endregion\\r\\n&quot;;         }         string GetDeleteFunction()         {             string con = &quot;#region Delete\\r\\n&quot;+                             tab+&quot;public bool Delete()\\r\\n&quot;+                  tab+&quot;{\\r\\n&quot;+                  tab+&quot;    bool result = false;\\r\\n&quot;+                  tab+&quot;    try\\r\\n&quot;+                  tab+&quot;    {\\r\\n&quot;+                  tab+&quot;        SqlCommand sqlcmd = CreateSQLCommand();\\r\\n&quot;+                  tab+&quot;        sqlcmd.CommandText = \\&quot;DELETE FROM &quot;+tablename+&quot; WHERE ID=@ID\\&quot;;\\r\\n&quot;+                  tab+&quot;        sqlcmd.Parameters.AddWithValue(\\&quot;@ID\\&quot;, m_ID);\\r\\n&quot;+                  tab+&quot;        sqlcmd.ExecuteNonQuery();\\r\\n&quot;+                  tab+&quot;        result = true;\\r\\n&quot;+                  tab+&quot;    }\\r\\n&quot;+                  tab+&quot;    catch (System.Exception ex)\\r\\n&quot;+                  tab+&quot;    {\\r\\n&quot;+                  tab+&quot;    }\\r\\n&quot;+                  tab+&quot;    return result;\\r\\n&quot;+                  tab+&quot;}\\r\\n&quot;+                  &quot;#endregion\\r\\n&quot;;             return con;         }         string GetInitParams()         {             string pr = &quot;&quot;;             int cnt = mListColumn.Count;             for (int a = 0; a &lt; cnt; a++)             {                 if (mListColumn[a].Type != &quot;string&quot;)                     pr += tab + tab + mListColumn[a].Type + &quot;.TryParse(reader[&quot; + a.ToString() + &quot;].ToString(), out m_&quot; + mListColumn[a].Name + &quot;);\\r\\n&quot;;                 else                     pr += tab + tab + mListColumn[a].Name +&quot;=reader[&quot; + a.ToString() + &quot;].ToString();\\r\\n&quot;;             }                       return pr;         }         string GetInitFunction()         {             string fn = &quot;#region Init\\r\\n&quot; +                     tab + &quot;public bool InitFromDataReader(SqlDataReader reader)\\r\\n&quot; +                     tab + &quot;{\\r\\n&quot; +                     tab + &quot;    try\\r\\n&quot; +                     tab + &quot;    {\\r\\n&quot; +                     GetInitParams() +                     tab + &quot;    }\\r\\n&quot; +                     tab + &quot;    catch (System.Exception ex)\\r\\n&quot; +                     tab + &quot;    {\\r\\n&quot; +                     tab + &quot;        return false;\\r\\n&quot; +                     tab + &quot;    }\\r\\n&quot; +                     tab + &quot;    return true;\\r\\n&quot; +                     tab + &quot;}\\r\\n&quot; +                     tab + &quot;public bool Init(string id)\\r\\n&quot; +                     tab + &quot;{\\r\\n&quot; +                     tab + &quot;    if (string.IsNullOrEmpty(id))\\r\\n&quot; +                     tab + &quot;        return false;\\r\\n&quot; +                     tab + &quot;    int t;\\r\\n&quot; +                     tab + &quot;    int.TryParse(id, out t);\\r\\n&quot; +                     tab + &quot;    return Init(t);\\r\\n&quot; +                     tab + &quot;}\\r\\n&quot; +                     tab + &quot;public bool Init(int id)\\r\\n&quot; +                     tab + &quot;{\\r\\n&quot; +                     tab + &quot;   if (!base.Open())\\r\\n&quot; +                     tab + &quot;       return false;\\r\\n&quot; +                     tab + &quot;   bool IsLoad = false;\\r\\n&quot; +                     tab + &quot;   try\\r\\n&quot; +                     tab + &quot;   {\\r\\n&quot; +                     tab + &quot;       SqlCommand sqlcmd = CreateSQLCommand();\\r\\n&quot; +                     tab + &quot;       sqlcmd.CommandText = \\&quot;SELECT * \\&quot; +\\r\\n&quot; +                     tab + &quot;           \\&quot;FROM &quot; + tablename + &quot; WHERE [ID]=@ID\\&quot;;\\r\\n&quot; +                     tab + &quot;       sqlcmd.Parameters.AddWithValue(\\&quot;@ID\\&quot;, id);\\r\\n&quot; +                     tab + &quot;       SqlDataReader reader = sqlcmd.ExecuteReader();\\r\\n&quot; +                     tab + &quot;       if (reader.Read())\\r\\n&quot; +                     tab + &quot;       {\\r\\n&quot; +                     tab + &quot;          if (!InitFromDataReader(reader))\\r\\n&quot; +                     tab + &quot;            {\\r\\n&quot; +                     tab + &quot;              reader.Close();\\r\\n&quot; +                     tab + &quot;              base.Close();\\r\\n&quot;+                     tab + &quot;              return false;\\r\\n&quot; +                     tab + &quot;            }\\r\\n&quot; +                     tab + &quot;           IsLoad = true;\\r\\n&quot; +                     tab + &quot;       }\\r\\n&quot; +                     tab + &quot;       reader.Close();\\r\\n&quot; +                     tab + &quot;   }\\r\\n&quot; +                     tab + &quot;   catch (System.Exception ex)\\r\\n&quot; +                     tab + &quot;   {\\r\\n&quot; +                     tab + &quot;       mError = ex.Message;\\r\\n&quot; +                     tab + &quot;       IsLoad = false;\\r\\n&quot; +                     tab + &quot;   }\\r\\n&quot; +                     tab + &quot;   base.Close();&quot; +                     tab + &quot;   return IsLoad;\\r\\n&quot; +                     tab + &quot;}\\r\\n&quot;;             fn += &quot;#endregion\\r\\n&quot;;             return fn;         }         string GetConstructor()         {             string con = &quot;#region Constructor\\r\\n&quot; +                 tab + &quot;public &quot; + className + &quot;(string ConnectionString)\\r\\n&quot; +                 tab + &quot;\\t: base (ConnectionString)\\r\\n&quot; +                 tab + &quot;{\\r\\n&quot; +                 tab + &quot;}\\r\\n&quot; +                 tab + &quot;public &quot; + className + &quot;()\\r\\n&quot; +                 tab + &quot;\\t:base(v2_SacuraConstants.ConnectionString)\\r\\n&quot; +                 tab + &quot;{\\r\\n&quot; +                 tab + &quot;}\\r\\n&quot; +                 &quot;#endregion\\r\\n&quot;;             return con;         }         string GetProperty()         {             mListColumn.Clear();             string src = &quot;#region Property\\r\\n&quot;;             \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/             \/\/add property             SqlConnection myConnection = new SqlConnection(connStr);             SqlDataAdapter myAdapter = new SqlDataAdapter(&quot;select * from &quot; + tablename, myConnection);             DataSet dataSet = new DataSet();             myConnection.Open();             myAdapter.Fill(dataSet, &quot;tablename&quot;);             myConnection.Close();             ConstraintCollection prKey = dataSet.Tables[0].Constraints;              for (int i = 0; i &lt; dataSet.Tables[0].Columns.Count; i++)             {                 string tab1 = &quot;\\t\\t\\t&quot;;                 src += tab;                 ColumnDB clTp = new ColumnDB(dataSet.Tables[0].Columns[i].ColumnName, dataSet.Tables[0].Columns[i].DataType.Name);                 mListColumn.Add(clTp);                 src += clTp.Type + &quot; m_&quot; + clTp.Name +&quot;=&quot;+clTp.Initial+ &quot;;\\r\\n&quot;;                 src += &quot;\\t\\t&quot;;                 src += &quot;public &quot;+clTp.Type + &quot; &quot; + clTp.Name + &quot;\\r\\n&quot; + tab + &quot;{\\r\\n&quot; +                     tab1 + &quot;get\\r\\n&quot; + tab1 + &quot;{\\r\\n&quot; + tab1 + &quot;\\treturn m_&quot; + clTp.Name + &quot;;\\r\\n&quot; + tab1 + &quot;}\\r\\n&quot; + tab1 +                     &quot;set\\r\\n&quot; + tab1 + &quot;{\\r\\n&quot; + tab1 + &quot;\\tm_&quot; + clTp.Name + &quot;=value;\\r\\n&quot; + tab1 + &quot;}\\r\\n&quot; + tab + &quot;}\\r\\n&quot;;             }             \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/             return src + &quot;#endregion\\r\\n&quot;;         }         string GetSaveInsertParams()         {             string pr = &quot;&quot;;             int cnt = mListColumn.Count;             for (int a = 1; a &lt; cnt; a++)             {                 pr += tab + tab + tab + (a == 1 ? &quot;\\&quot;[&quot; : &quot;\\&quot;,[&quot;) + mListColumn[a].Name + &quot;]\\&quot;+\\r\\n&quot;;             }             return pr;         }         string GetSaveInsertValues()         {             string pr = &quot;&quot;;             int cnt = mListColumn.Count;             for (int a = 1; a &lt; cnt; a++)             {                 pr += tab + tab + tab + (a == 1 ? &quot;\\&quot;@&quot; : &quot;\\&quot;,@&quot;) + mListColumn[a].Name + (a != cnt - 1 ? &quot;\\&quot;+\\r\\n&quot; : &quot;)\\&quot;&quot;);             }             return pr;         }         string GetSaveUpdateParams()         {             string pr = &quot;&quot;;             int cnt = mListColumn.Count;             for (int a = 1; a &lt; cnt; a++)             {                 pr += tab + tab + tab + (a == 1 ? &quot;\\&quot;[&quot; : &quot;\\&quot;,[&quot;) + mListColumn[a].Name + &quot;]=@&quot; + mListColumn[a].Name +                     &quot;\\&quot;&quot; + (a != cnt - 1 ? &quot;+\\r\\n&quot; : &quot;&quot;);             }             return pr;         }         string GetAddWithValue()         {             string pr = &quot;&quot;;             int cnt = mListColumn.Count;             for (int a = 1; a &lt; cnt; a++)             {                 pr += tab + tab + &quot;sqlcmd.Parameters.AddWithValue(\\&quot;@&quot; + mListColumn[a].Name +&quot;\\&quot;, m_&quot;+                     mListColumn[a].Name+&quot;);\\r\\n&quot;;             }             return pr;         }         string GetSaveFunction()         {             string con = &quot;#region Save\\r\\n&quot; +             tab + &quot;public bool Save()\\r\\n&quot; +             tab + &quot;    {\\r\\n&quot; +             tab + &quot;        bool result = false;\\r\\n&quot; +             tab + &quot;        try\\r\\n&quot; +             tab + &quot;        {\\r\\n&quot; +             tab + &quot;            SqlCommand sqlcmd = CreateSQLCommand();\\r\\n&quot; +             tab + &quot;            if (m_ID &lt;= 0)\\r\\n&quot; +             tab + &quot;            {\\r\\n&quot; +             tab + &quot;                sqlcmd.CommandText = \\&quot;INSERT INTO &quot; + tablename + &quot; (  \\&quot;+\\r\\n&quot; +                     GetSaveInsertParams() +             tab + &quot;                     \\&quot;) VALUES (\\&quot;+\\r\\n&quot; +                     GetSaveInsertValues() + &quot;+\\&quot;;SELECT CAST(scope_identity() AS int)\\&quot;;\\r\\n&quot; +             tab + &quot;            }\\r\\n&quot; +             tab + &quot;            else\\r\\n&quot; +             tab + &quot;            {\\r\\n&quot; +             tab + &quot;                sqlcmd.CommandText = \\&quot;UPDATE &quot; + tablename + &quot; SET \\&quot; +\\r\\n&quot; +                     GetSaveUpdateParams() + &quot;+\\r\\n&quot; +             tab + &quot;                \\&quot; WHERE ID=@ID\\&quot;;\\r\\n&quot; +             tab + &quot;                sqlcmd.Parameters.AddWithValue(\\&quot;@ID\\&quot;, m_ID);\\r\\n&quot; +             tab + &quot;            }\\r\\n&quot; +             tab + GetAddWithValue() + &quot;\\r\\n&quot; +             tab + &quot;            if (m_ID &gt; 0)\\r\\n&quot; +             tab + &quot;                sqlcmd.ExecuteNonQuery();\\r\\n&quot; +             tab + &quot;            else\\r\\n&quot; +             tab + &quot;            {\\r\\n&quot; +             tab + &quot;                object ob;\\r\\n&quot; +             tab + &quot;                ob = sqlcmd.ExecuteScalar();\\r\\n&quot; +             tab + &quot;                if(ob != null)\\r\\n&quot; +             tab + &quot;                    int.TryParse(ob.ToString(), out m_ID);\\r\\n&quot; +             tab + &quot;            }\\r\\n&quot; +             tab + &quot;        }\\r\\n&quot; +             tab + &quot;        catch (System.Exception ex)\\r\\n&quot; +             tab + &quot;        {\\r\\n&quot; +             tab + &quot;            mError = ex.Message;\\r\\n&quot; +             tab + &quot;            result = false;\\r\\n&quot; +             tab + &quot;        }\\r\\n&quot; +             tab + &quot;        return result;\\r\\n&quot; +             tab + &quot;    }\\r\\n&quot; +             &quot;#endregion\\r\\n&quot;;             return con;         }     }  } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u0440\u043e\u0434\u0435 \u0431\u044b, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0435\u0448\u0435\u043d\u0430. \u041d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c: \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0444\u0430\u0439\u043b\u043e\u0432, \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433. \u0414\u0430 \u0435\u0449\u0435 \u0443 \u0440\u0435\u0431\u044f\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c. \u041e\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c UI \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439 \u0435\u0433\u043e \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438. <\/p>\n<p>  <b>\u0428\u0430\u0433 \u0432\u0442\u043e\u0440\u043e\u0439<\/b><\/p>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u043f\u043e\u0438\u0441\u043a\u0438 \u0432 \u0441\u0435\u0442\u0438 \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 <a href=\"https:\/\/msdn.microsoft.com\/ru-ru\/library\/system.type(v=vs.110).aspx\">\u043a\u043b\u0430\u0441\u0441 Type<\/a>, \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c, \u044f \u043f\u043e\u0447\u0438\u0442\u0430\u043b \u043f\u0440\u043e \u043d\u0435\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435. \u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0443. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u2026 \u041f\u043e\u043b\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0418 \u044f \u043d\u0430\u0447\u0430\u043b \u044d\u043a\u0441\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0438\u043c, \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043b: <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\"><habracut\/>  <\/p>\n<pre><code class=\"cs\">using System; using System.Collections.Generic; using System.Reflection; using System.Threading;  namespace SV.Tools { \tpublic delegate void AddProp(string name, string val); \t\/\/\/ &lt;summary&gt; \t\/\/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \t\/\/\/ &lt;\/summary&gt; \tpublic struct MetodInfoDouble \t{ \t\tpublic MethodInfo getMetod; \t\tpublic MethodInfo setMetod; \t} \t\/\/\/ &lt;summary&gt; \t\/\/\/ \u043a\u043b\u0430\u0441\u0441 \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 :( \u043d\u0443 \u0438 \u043e\u043f\u0438\u0441\u0430\u043b\u043e\u0432\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \t\/\/\/ &lt;\/summary&gt; \tpublic class ClassesTools \t{ \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0435\u0445 \u043f\u043e\u0440\u043f\u0435\u0440\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u0438\u044f \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;ob&quot;&gt;&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;delegateProp&quot;&gt;&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;parentName&quot;&gt;&lt;\/param&gt; \t\tpublic static void GetAllPropertyData(object ob, AddProp delegateProp, string parentName = &quot;&quot;) \t\t{ \t\t\tif (ob == null || delegateProp == null) \t\t\t\treturn; \t\t\tPropertyInfo[] propInfo = ob.GetType().GetProperties(); \t\t\tfor (int b = 0; b &lt; propInfo.Length; b++) \t\t\t{ \t\t\t\tParameterInfo[] param = propInfo[b].GetIndexParameters(); \t\t\t\tif (param.Length == 0 && propInfo[b].CanRead && propInfo[b].Name != &quot;Root&quot; && propInfo[b].Name != &quot;Parent&quot;) \t\t\t\t{ \t\t\t\t\tobject data = propInfo[b].GetValue(ob, null); \t\t\t\t\tif (propInfo[b].PropertyType.IsInterface && data != null) \t\t\t\t\t{ \t\t\t\t\t\t\tGetAllPropertyData(data, delegateProp, (parentName == &quot;&quot; ? &quot;&quot; : parentName + &quot;.&quot;) + propInfo[b].Name);  \t\t\t\t\t} \t\t\t\t\telse \t\t\t\t\t{ \t\t\t\t\t\tdelegateProp((parentName == &quot;&quot; ? &quot;&quot; : parentName + &quot;.&quot;) + propInfo[b].Name, \t\t\t\t\t\t\t( data == null ? &quot;NULL&quot; : SV.ConversionTools.DataCoversion.ConvertByType(data))); \t\t\t\t\t} \t\t\t\t} \t\t\t} \t\t}  \t\tstatic AppDomain domain = Thread.GetDomain(); \t\tstatic Assembly[] asm = domain.GetAssemblies(); \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u043f\u043e\u0438\u0441\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0441\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;name&quot;&gt;\u0438\u043c\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;&lt;\/returns&gt; \t\tpublic static Type FindInterfece(string Namespace, string Name, bool isIgnorCase = true) \t\t{ \t\t\tif (Namespace == &quot;&quot; || Name == &quot;&quot;) \t\t\t\treturn null; \t\t\t \t\t\tint count = asm.Length; \t\t\tfor (int a = 0; a &lt; count; a++) \t\t\t{ \t\t\t\tType t = asm[a].GetType(Namespace+&quot;.&quot;+Name); \t\t\t\tif (t != null) \t\t\t\t\treturn t; \t\t\t} \t\t\treturn null; \t\t} \t\tpublic static List&lt;Type&gt; GetAsseblyIntrface(string AssembleName, string Namespace) \t\t{ \t\t\tif (Namespace == &quot;&quot; ) \t\t\t\treturn null; \t\t\tint count = asm.Length; \t\t\tfor (int a = 0; a &lt; count; a++) \t\t\t{ \t\t\t\tif (asm[a].GetName().Name == AssembleName) \t\t\t\t{ \t\t\t\t\tType[] t = asm[a].GetTypes(); \t\t\t\t\tList&lt;Type&gt; lst = new List&lt;Type&gt;(); \t\t\t\t\tcount = t.Length; \t\t\t\t\tfor(int b =0; b &lt; count; b++) \t\t\t\t\t{ \t\t\t\t\t\tif (t[b].Namespace == Namespace) \t\t\t\t\t\t\tlst.Add(t[b]); \t\t\t\t\t} \t\t\t\t\treturn lst; \t\t\t\t}\t\t\t\t \t\t\t} \t\t\treturn null; \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435, \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;tp&quot;&gt;&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;listInterfece&quot;&gt;&lt;\/param&gt; \t\tpublic static void GetAllInterfece(Type[] tp, ref List&lt;Type&gt; listInterfece) \t\t{ \t\t\tif (tp == null) \t\t\t\treturn; \t\t\tint count = tp.Length; \t\t\tfor (int a = 0; a &lt; count; a++) \t\t\t{ \t\t\t\tType rezult = listInterfece.Find( \t\t\t\t\tdelegate(Type typ) \t\t\t\t\t{ \t\t\t\t\t\treturn tp[a] == typ; \t\t\t\t\t} \t\t\t\t\t); \t\t\t\tif (rezult == null) \t\t\t\t\tlistInterfece.Add(tp[a]); \t\t\t\tType[] t = tp[a].GetInterfaces(); \t\t\t\tGetAllInterfece(t, ref listInterfece); \t\t\t} \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;parentClass&quot;&gt;&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;&lt;\/returns&gt; \t\tpublic static List&lt;Type&gt; GetAllInterfece(Type parentClass) \t\t{ \t\t\tList&lt;Type&gt; listClasses = new List&lt;Type&gt;(); \t\t\tGetAllInterfece(new Type[] { parentClass }, ref listClasses); \t\t\treturn listClasses; \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0435 \u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435, \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;parentClass&quot;&gt;&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;listInterfece&quot;&gt;&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;&lt;\/returns&gt; \t\tpublic static List&lt;Type&gt; GetAllInterfece(Type parentClass, List&lt;Type&gt; listInterfece) \t\t{ \t\t\tList&lt;Type&gt; listClasses = new List&lt;Type&gt;(); \t\t\tGetAllInterfece(new Type[] { parentClass }, ref listClasses); \t\t\tGetAllInterfece(listInterfece.ToArray(), ref listInterfece); \t\t\treturn RemoveDouble(listClasses, listInterfece); \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0432 \u0441\u043f\u0438\u0441\u043a\u0430\u0445 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;sources&quot;&gt;\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;editableList&quot;&gt;\u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0431\u0435\u0440\u0443\u0442\u044c\u0441\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 sources&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;\u0432\u043e\u0437\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&lt;\/returns&gt; \t\tpublic static List&lt;Type&gt; RemoveDouble(List&lt;Type&gt; sources, List&lt;Type&gt; editableList) \t\t{ \t\t\tfor (int a = editableList.Count - 1; a &gt;= 0; a--) \t\t\t{ \t\t\t\tif (sources.Find((Type t) =&gt; editableList[a] == t) != null) \t\t\t\t\teditableList.RemoveAt(a); \t\t\t} \t\t\treturn editableList; \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u043f\u043e\u0438\u0441\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445 \u0442\u0438\u043f\u0430 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;_class&quot;&gt;\u0442\u0438\u043f \u043a\u043b\u0430\u0441\u0441\u0430&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;propertyName&quot;&gt;\u0438\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;\u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440&lt;\/returns&gt; \t\t\/\/\/ &lt;remarks&gt; \t\t\/\/\/ \u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \t\t\/\/\/ &lt;\/remarks&gt; \t\tpublic static PropertyInfo FindProperty(Type _class, string propertyName) \t\t{ \t\t\tList&lt;PropertyInfo&gt; allProperty = GetAllProperty(_class); \t\t\tint count = allProperty.Count; \t\t\tPropertyInfo info = null; \t\t\tfor (int a = 0; a &lt; count; a++) \t\t\t{ \t\t\t\tif (allProperty[a].Name == propertyName) \t\t\t\t{ \t\t\t\t\tinfo = allProperty[a]; \t\t\t\t\tbreak; \t\t\t\t} \t\t\t}  \t\t\treturn info; \t\t} \t\tpublic static List&lt;Type&gt; RemoveDouble(List&lt;Type&gt; property) \t\t{ \t\t\tList&lt;Type&gt; retryList = new List&lt;Type&gt;(); \t\t\tint count = property.Count; \t\t\tfor (int a = 0; a &lt; count; a++) \t\t\t{ \t\t\t\tif (retryList.Find((Type inf) =&gt; property[a] == inf) == null) \t\t\t\t\tretryList.Add(property[a]);  \t\t\t} \t\t\treturn retryList; \t\t}  \t\tpublic static List&lt;PropertyInfo&gt; RemoveDouble(List&lt;PropertyInfo&gt; property) \t\t{ \t\t\tList&lt;PropertyInfo&gt; retryList = new List&lt;PropertyInfo&gt;(); \t\t\tint count = property.Count; \t\t\tfor (int a = 0; a &lt; count; a++) \t\t\t{ \t\t\t\tif(retryList.Find( (PropertyInfo inf) =&gt;property[a] == inf\t) == null) \t\t\t\t\tretryList.Add(property[a]);  \t\t\t} \t\t\treturn retryList; \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e \u0442\u0438\u043f\u0443, \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u0443\u0431\u043b\u0435\u0439 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;interfeceList&quot;&gt;\u0440\u043e\u0434\u0438\u0434\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0442\u0438\u043f&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;\u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432&lt;\/returns&gt; \t\t\/\/\/ &lt;remarks&gt; \t\t\/\/\/ \u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \t\t\/\/\/ &lt;\/remarks&gt; \t\tpublic static List&lt;PropertyInfo&gt; GetAllProperty(Type parent) \t\t{ \t\t\tList&lt;Type&gt; allTypes = GetAllInterfece(parent); \t\t\tList&lt;PropertyInfo&gt; allProperty = new List&lt;PropertyInfo&gt;(); \t\t\tif (allTypes != null) \t\t\t{ \t\t\t\tint count = allTypes.Count; \t\t\t\tfor(int a =0; a &lt; count; a++) \t\t\t\t{ \t\t\t\t\tallProperty.AddRange(allTypes[a].GetProperties(\/*BindingFlags.Default*\/)); \t\t\t\t} \t\t\t} \t\t\treturn RemoveDouble(allProperty); \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u043f\u043e\u0438\u0441\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;name&quot;&gt;\u0438\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;&lt;\/returns&gt; \t\tpublic static PropertyInfo GetPropertyByName(object curr, string name, ref object objectIsCall) \t\t{ \t\t\tif (curr == null) \t\t\t\treturn null; \t\t\tPropertyInfo pI = curr.GetType().GetProperty(name); \t\t\tobjectIsCall = curr; \t\t\tif (pI == null) \t\t\t{  \t\t\t\tint t = name.IndexOf('.'); \t\t\t\tif (t &gt; 0) \t\t\t\t{ \t\t\t\t\tstring curName = name.Substring(0, t); \t\t\t\t\tpI = curr.GetType().GetProperty(curName); \t\t\t\t\tif (pI != null) \t\t\t\t\t{ \t\t\t\t\t\tname = name.Remove(0, t + 1); \t\t\t\t\t\tif (name.Length &gt; 0) \t\t\t\t\t\t{ \t\t\t\t\t\t\tobject v = pI.GetValue(curr, null); \t\t\t\t\t\t\tif (v == null) \t\t\t\t\t\t\t\treturn null; \t\t\t\t\t\t\treturn GetPropertyByName(v, name, ref objectIsCall); \t\t\t\t\t\t} \t\t\t\t\t}  \t\t\t\t} \t\t\t} \t\t\treturn pI; \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043a\u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;interfeceList&quot;&gt;\u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\\\u043a\u043b\u0430\u0441\u0441\u0430&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;propertyInfo&quot;&gt;\u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;memberInfo&quot;&gt;\u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;fieldInfo&quot;&gt;\u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;metodInfo&quot;&gt;\u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;eventInfo&quot;&gt;\u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f&lt;\/param&gt; \t\tpublic static void GetInterfaceMetadata(List&lt;Type&gt; interfeceList, ref List&lt;PropertyInfo&gt; propertyInfo, \t\t\tref List&lt;MemberInfo&gt; memberInfo, ref List&lt;FieldInfo&gt; fieldInfo, ref List&lt;MethodInfo&gt; metodInfo, ref List&lt;EventInfo&gt; eventInfo) \t\t{ \t\t\tint count = interfeceList.Count; \t\t\tfor (int a = 0; a &lt; count; a++) \t\t\t{ \t\t\t\t\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ \t\t\t\t\/\/\u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0435\u0432\u0435\u043d\u0442\u044b \u0438 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438 \t\t\t\tPropertyInfo[] propertyIE = interfeceList[a].GetProperties(); \t\t\t\tpropertyInfo.AddRange(propertyIE); \t\t\t\tEventInfo[] events = interfeceList[a].GetEvents(); \t\t\t\teventInfo.AddRange(events); \t\t\t\tMemberInfo[] membersIE = interfeceList[a].GetMembers(); \t\t\t\tmemberInfo.AddRange(membersIE); \t\t\t\tFieldInfo[] fieldIE = interfeceList[a].GetFields(); \t\t\t\tfieldInfo.AddRange(fieldIE); \t\t\t\tMethodInfo[] metodIE = interfeceList[a].GetMethods(); \t\t\t\tmetodInfo.AddRange(metodIE); \t\t\t}  \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0432\u043e\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f  \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0435\u0439 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;propertyInfoInterface&quot;&gt;&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;&lt;\/returns&gt; \t\tpublic static Dictionary&lt;string, MetodInfoDouble&gt; RemoveDoubleProperty(List&lt;PropertyInfo&gt; propertyInfoInterface) \t\t{ \t\t\tif (propertyInfoInterface == null) \t\t\t\treturn null; \t\t\tDictionary&lt;string, MetodInfoDouble&gt; m_doubleList = new Dictionary&lt;string, MetodInfoDouble&gt;(); \t\t\tint count = propertyInfoInterface.Count - 1; \t\t\tfor (int a = count; a &gt;= 0; a--) \t\t\t{ \t\t\t\tList&lt;PropertyInfo&gt; fnd = propertyInfoInterface.FindAll( \t\t\t\t\t(PropertyInfo inf) =&gt; inf.Name == propertyInfoInterface[a].Name);  \t\t\t\tPropertyInfo fullMetod = null; \t\t\t\tMetodInfoDouble mDouble = new MetodInfoDouble(); \t\t\t\tmDouble.getMetod = null; \t\t\t\tmDouble.setMetod = null;  \t\t\t\tif (fnd != null && fnd.Count &gt; 1) \t\t\t\t{ \t\t\t\t\tstring tmp = &quot;&quot;; \t\t\t\t\tfor (int b = 0; b &lt; fnd.Count; b++) \t\t\t\t\t{ \t\t\t\t\t\ttmp += fnd[b].ReflectedType.FullName + &quot;\\r\\n&quot;; \t\t\t\t\t\tpropertyInfoInterface.Remove(fnd[b]); \t\t\t\t\t\tif (fnd[b].CanRead && fnd[b].CanWrite) \t\t\t\t\t\t\tfullMetod = fnd[b]; \t\t\t\t\t\telse if (fnd[b].CanRead) \t\t\t\t\t\t\tmDouble.getMetod = fnd[b].GetGetMethod(); \t\t\t\t\t\telse if (fnd[b].CanWrite) \t\t\t\t\t\t\tmDouble.setMetod = fnd[b].GetSetMethod(); \t\t\t\t\t} #if DEBUG \t\t\t\t\t\/\/MessageBox.Show(&quot;DEBUG:\\r\\n\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c: &quot; + fnd[0].Name + &quot;\\r\\n\u0412 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u0445:\\r\\n&quot; + tmp); #endif  \t\t\t\t\tif (fullMetod != null) \t\t\t\t\t\tpropertyInfoInterface.Add(fullMetod); \t\t\t\t\telse \t\t\t\t\t{ \t\t\t\t\t\tm_doubleList.Add(fnd[0].Name, mDouble); \t\t\t\t\t\tpropertyInfoInterface.Add(fnd[0]); \t\t\t\t\t} \t\t\t\t}  \t\t\t}  \t\t\treturn m_doubleList; \t\t} \t\tpublic static bool IsPrimitive(Type t) \t\t{ \t\t\tif (t == null) \t\t\t\treturn true; \t\t\tif (!t.IsClass && !t.IsInterface || t.IsPrimitive || t.IsEnum || t == typeof(String) || t == typeof(Guid) || t == typeof(DateTime)) \t\t\t\treturn true;  \t\t\treturn false; \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;propertyName&quot;&gt;\u0438\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&lt;\/param&gt; \t\t\/\/\/&lt;param name=&quot;param&quot;&gt;\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;\u0434\u0430\u043d\u043d\u044b\u0435, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c null \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u043b\u0438 \u043e\u043d \u043d\u0443\u043b\u0435\u0432\u043e\u0439&lt;\/returns&gt; \t\tstatic public object GetData(object baseCalss,string propertyName, object[] param = null) \t\t{ \t\t\tif (baseCalss == null || propertyName == null) \t\t\t\treturn null; \t\t\tobject RecalcOb = null; \t\t\tPropertyInfo _PropertyDescriptor = SV.Tools.ClassesTools.GetPropertyByName(baseCalss, propertyName.ToString(), ref RecalcOb); \t\t\tobject v = null; \t\t\tif (_PropertyDescriptor != null) \t\t\t\tv = _PropertyDescriptor.GetValue((RecalcOb == null ? baseCalss : RecalcOb), param); \t\t\treturn v; \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;propertyName&quot;&gt;\u0438\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;newPropertyData&quot;&gt;\u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&lt;\/param&gt; \t\t\/\/\/&lt;param name=&quot;param&quot;&gt;\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;false - \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435\u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d&lt;\/returns&gt; \t\tstatic public bool SetData(object baseCalss, string propertyName, object newPropertyData, object[] param = null) \t\t{ \t\t\tif (baseCalss == null || propertyName == null) \t\t\t\treturn false; \t\t\tobject RecalcOb = null; \t\t\tPropertyInfo _PropertyDescriptor = SV.Tools.ClassesTools.GetPropertyByName(baseCalss, propertyName, ref RecalcOb); \t\t\tif (_PropertyDescriptor == null) \t\t\t\treturn false;  \t\t\tobject data = newPropertyData; \t\t\tif (newPropertyData != null && newPropertyData.GetType() != _PropertyDescriptor.PropertyType) \t\t\t\tdata = SV.ConversionTools.DataCoversion.ConvertByType(data.ToString(), _PropertyDescriptor.PropertyType); \t\t\t_PropertyDescriptor.SetValue((RecalcOb == null ? baseCalss : RecalcOb), data, param); \t\t\treturn true; \t\t}   \t} } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u044f \u043c\u043e\u0433 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043b\u044e\u0431\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0438 <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0434\u0430\u0436\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">\t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;propertyName&quot;&gt;\u0438\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&lt;\/param&gt; \t\t\/\/\/&lt;param name=&quot;param&quot;&gt;\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;\u0434\u0430\u043d\u043d\u044b\u0435, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c null \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u043b\u0438 \u043e\u043d \u043d\u0443\u043b\u0435\u0432\u043e\u0439&lt;\/returns&gt; \t\tstatic public object GetData(object baseCalss,string propertyName, object[] param = null) \t\t{ \t\t\tif (baseCalss == null || propertyName == null) \t\t\t\treturn null; \t\t\tobject RecalcOb = null; \t\t\tPropertyInfo _PropertyDescriptor = SV.Tools.ClassesTools.GetPropertyByName(baseCalss, propertyName.ToString(), ref RecalcOb); \t\t\tobject v = null; \t\t\tif (_PropertyDescriptor != null) \t\t\t\tv = _PropertyDescriptor.GetValue((RecalcOb == null ? baseCalss : RecalcOb), param); \t\t\treturn v; \t\t} \t\t\/\/\/ &lt;summary&gt; \t\t\/\/\/ \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \t\t\/\/\/ &lt;\/summary&gt; \t\t\/\/\/ &lt;param name=&quot;propertyName&quot;&gt;\u0438\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430&lt;\/param&gt; \t\t\/\/\/ &lt;param name=&quot;newPropertyData&quot;&gt;\u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&lt;\/param&gt; \t\t\/\/\/&lt;param name=&quot;param&quot;&gt;\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b&lt;\/param&gt; \t\t\/\/\/ &lt;returns&gt;false - \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435\u0431\u044b\u043b \u043d\u0430\u0439\u0434\u0435\u043d&lt;\/returns&gt; \t\tstatic public bool SetData(object baseCalss, string propertyName, object newPropertyData, object[] param = null) \t\t{ \t\t\tif (baseCalss == null || propertyName == null) \t\t\t\treturn false; \t\t\tobject RecalcOb = null; \t\t\tPropertyInfo _PropertyDescriptor = SV.Tools.ClassesTools.GetPropertyByName(baseCalss, propertyName, ref RecalcOb); \t\t\tif (_PropertyDescriptor == null) \t\t\t\treturn false;  \t\t\tobject data = newPropertyData; \t\t\tif (newPropertyData != null && newPropertyData.GetType() != _PropertyDescriptor.PropertyType) \t\t\t\tdata = SV.ConversionTools.DataCoversion.ConvertByType(data.ToString(), _PropertyDescriptor.PropertyType); \t\t\t_PropertyDescriptor.SetValue((RecalcOb == null ? baseCalss : RecalcOb), data, param); \t\t\treturn true; \t\t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u042d\u0442\u043e \u0431\u044b\u043b \u043f\u0440\u043e\u0440\u044b\u0432. \u0411\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043e\u0431\u0435\u0440\u0442\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430\u0441\u044c \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u043a GUI \u043f\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c. \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f. <br \/>  <b><i>\u041d\u043e \u044f \u0436\u0435 \u043b\u0435\u043d\u0438\u0432\u044b\u0439.<\/i><\/b><\/p>\n<p>  <b>\u0428\u0430\u0433 \u0442\u0440\u0435\u0442\u0438\u0439<\/b><\/p>\n<p>  \u0421\u0438\u0434\u044f, \u043a\u0430\u043a \u0442\u043e, \u0432 \u043f\u044f\u0442\u043d\u0438\u0446\u0443, \u0432 \u0431\u0430\u0440\u0435, \u0432 \u0433\u043b\u0430\u0437\u0430 \u0431\u0440\u043e\u0441\u0438\u043b\u0430\u0441\u044c \u043a\u0430\u043a\u0430\u044f \u0442\u043e \u0432\u044b\u0432\u0435\u0441\u043a\u0430-\u0440\u0435\u043a\u043b\u0430\u043c\u0430. \u0427\u0442\u043e-\u0442\u043e \u0442\u0430\u043c \u0431\u044b\u043b\u043e \u0441 \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043c ASM\u2026 \u0417\u0430\u0442\u0443\u043c\u0430\u043d\u0435\u043d\u043d\u044b\u0439 \u043c\u043e\u0437\u0433, \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0434\u0431\u0440\u043e\u0441\u0438\u043b \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u044e: ASM \u2014 ASSEMBLER \u0438 \u0442\u0443\u0442 \u0436\u0435 \u0432\u0441\u043f\u043b\u044b\u043b\u043e \u0432\u043e\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Common_Intermediate_Language\">Common Intermediate Language<\/a>, \u0430 \u0437\u0430 \u043d\u0438\u043c <a href=\"https:\/\/msdn.microsoft.com\/ru-ru\/library\/f7dy01k1(v=vs.110).aspx\">IL Disassembler<\/a>. \u0411\u0440\u043e\u0441\u0438\u0432 \u0434\u0440\u0443\u0437\u0435\u0439 \u0438 \u0431\u0430\u0440, \u044f \u043f\u043e\u0431\u0435\u0436\u0430\u043b \u0434\u043e\u043c\u043e\u0439, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432, \u043f\u0440\u0430\u0432\u0434\u0430, \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0441 \u0441\u043e\u0431\u043e\u0439 \u043f\u0430\u0440\u0443 \u043b\u0438\u0442\u0440\u043e\u0432 \u043f\u0438\u0432\u0430 \u0434\u043b\u044f \u0441\u0442\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>  <b><a href=\"https:\/\/msdn.microsoft.com\/ru-ru\/library\/system.reflection.emit.ilgenerator(v=vs.110).aspx\">\u041a\u043b\u0430\u0441\u0441 ILGenerator<\/a><\/b><br \/>  \u0414\u043e\u043c\u0430, \u043f\u043e\u0447\u0438\u0442\u0430\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443, \u044f \u043f\u043e\u043d\u044f\u043b \u2014 \u044d\u0442\u043e \u043e\u043d\u043e.<\/p>\n<p>  <b>\u041a\u0440\u0443\u0447\u0443-\u0432\u0435\u0440\u0447\u0443, \u0447\u0442\u043e \u0445\u043e\u0447\u0443 \u0442\u043e \u0438 \u0432\u043e\u0440\u043e\u0447\u0443<\/b><\/p>\n<p>  \u0421\u043e\u0431\u0440\u0430\u0432 \u0432 \u043a\u0443\u0447\u0443 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u044f \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b \u043a \u0434\u0435\u043b\u0443.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0435\u0440\u0432\u043e-\u043d\u0430\u043f\u0435\u0440\u0432\u043e \u0441\u043e\u0437\u0434\u0430\u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u043c \u043a\u043e\u0434\u043e\u043c<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code class=\"cs\"> interface iT     {         int i { get; set; }     }     class cT : iT     {         int t = 0;         public int i         {             get             {                 return t;             }             set             {                 t = value;             }         }     }     class Program     {         static void Main(string[] args)         {         }     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u042f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432\u043e \u0447\u0442\u043e \u043e\u043d \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/msdn.microsoft.com\/ru-ru\/library\/f7dy01k1(v=vs.110).aspx\">Ildasm.exe (IL Disassembler)<\/a><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ASM code:<\/b><\/p>\n<div class=\"spoiler_text\">  <habracut\/>  <\/p>\n<pre><code>.class interface private abstract auto ansi ILG.iT {   .method public hidebysig newslot specialname abstract virtual            instance int32  get_i() cil managed   {   } \/\/ end of method iT::get_i    .method public hidebysig newslot specialname abstract virtual            instance void  set_i(int32 'value') cil managed   {   } \/\/ end of method iT::set_i    .property instance int32 i()   {     .get instance int32 ILG.iT::get_i()     .set instance void ILG.iT::set_i(int32)   } \/\/ end of property iT::i } \/\/ end of class ILG.iT  .class private auto ansi beforefieldinit ILG.cT        extends [mscorlib]System.Object        implements ILG.iT {   .field private int32 t   .method public hidebysig newslot specialname virtual final            instance int32  get_i() cil managed   {     \/\/      .maxstack  1     .locals init ([0] int32 V_0)     IL_0000:  nop     IL_0001:  ldarg.0     IL_0002:  ldfld      int32 ILG.cT::t     IL_0007:  stloc.0     IL_0008:  br.s       IL_000a      IL_000a:  ldloc.0     IL_000b:  ret   } \/\/ end of method cT::get_i    .method public hidebysig newslot specialname virtual final            instance void  set_i(int32 'value') cil managed   {     \/\/      .maxstack  8     IL_0000:  nop     IL_0001:  ldarg.0     IL_0002:  ldarg.1     IL_0003:  stfld      int32 ILG.cT::t     IL_0008:  ret   } \/\/ end of method cT::set_i    .method public hidebysig specialname rtspecialname            instance void  .ctor() cil managed   {     \/\/      .maxstack  8     IL_0000:  ldarg.0     IL_0001:  ldc.i4.0     IL_0002:  stfld      int32 ILG.cT::t     IL_0007:  ldarg.0     IL_0008:  call       instance void [mscorlib]System.Object::.ctor()     IL_000d:  nop     IL_000e:  ret   } \/\/ end of method cT::.ctor    .property instance int32 i()   {     .get instance int32 ILG.cT::get_i()     .set instance void ILG.cT::set_i(int32)   } \/\/ end of property cT::i } \/\/ end of class ILG.cT <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043f\u043e\u0447\u0435\u0441\u0430\u0432 \u0440\u0435\u043f\u0443, \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u043a\u043b\u0430\u0441\u0441 \u043f\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445: \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430(\u043b\u044e\u0431\u043e\u0433\u043e) \u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432:<\/p>\n<p>  \u2192 <a href=\"https:\/\/github.com\/Veznich\/GCSV\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 GitHub<\/a><\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u043f\u0438\u0448\u0443 \u043f\u0440\u043e\u0435\u043a\u0442<\/h3>\n<p>  <b>\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0430: <\/b><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">GET<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code class=\"cs\">\tvoid CreatePropertyGetMetod(PropertyInfo property, PropertyBuilder custNamePropBldr, FieldBuilder fieldProperty, object redirectData) \t\t{ \t\t\t#region GET_METOD \t\t\t\/\/\u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0433\u0435\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438 \t\t\tMethodInfo inf = property.GetGetMethod(); \t\t\t\/\/\u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435\u0442 \u0438\u0449\u0435\u043c \u0432 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \t\t\tif (inf == null) \t\t\t{ \t\t\t\tif (m_doubleList.ContainsKey(property.Name)) \t\t\t\t\tinf = m_doubleList[property.Name].getMetod; \t\t\t} \t\t\t\/\/\u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u0439\u0434\u0435\u043d \u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0435\u0433\u043e \u0434\u0435\u043b\u0430\u0442\u044c \t\t\tif (inf != null) \t\t\t{ \t\t\t\t\/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \t\t\t\tMethodBuilder custNameGetPropMthdBldr = \t\t\t\t\t\tm_TypeBuilder.DefineMethod(&quot;get_&quot; + property.Name, \t\t\t\t\t\t\t\t\t\t\t\tm_getSetAttr, \t\t\t\t\t\t\t\t\t\t\t\t  property.PropertyType, \t\t\t\t\t\t\t\t\t\t\t\t   Type.EmptyTypes); \t\t\t\t\/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0418\u041b \t\t\t\tILGenerator custNameGetIL = custNameGetPropMthdBldr.GetILGenerator(); \t\t\t\tSystem.Reflection.Emit.Label end = custNameGetIL.DefineLabel(); \t\t\t\t\/\/\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0441\u043c\u043e\u043a\u043e\u0434 \t\t\t\tcustNameGetIL.Emit(OpCodes.Nop); \t\t\t\tcustNameGetIL.Emit(OpCodes.Ldarg_0); \t\t\t\t\/\/\u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \t\t\t\tcustNameGetIL.Emit(OpCodes.Ldfld, fieldProperty); \t\t\t\t\/\/\u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438 \t\t\t\tcustNameGetIL.Emit(OpCodes.Ret); \t\t\t\t\/\/\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \t\t\t\tm_TypeBuilder.DefineMethodOverride(custNameGetPropMthdBldr, inf); \t\t\t\t\/\/\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \t\t\t\tcustNamePropBldr.SetGetMethod(custNameGetPropMthdBldr); \t\t\t} \t\t\t\/\/\u043a\u043e\u043d\u0435\u0446 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0413\u0415\u0422 \u043c\u0435\u0442\u043e\u0434\u0430  \t\t\t\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ \t\t\t#endregion \t\t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">SET<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code class=\"cs\">void CreatePropertySetMetod(PropertyInfo property, PropertyBuilder custNamePropBldr, FieldBuilder fieldProperty, object redirectData) \t\t{ \t\t\t#region SET_METOD \t\t\t\/\/\u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \t\t\tMethodInfo inf = property.GetSetMethod(); \t\t\t\/\/\u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0442\u043e \u0438\u0449\u0435\u043c \u0432 \u0434\u0443\u0431\u043b\u044f\u0445 \t\t\tif (inf == null) \t\t\t{ \t\t\t\tif (m_doubleList != null && m_doubleList.ContainsKey(property.Name)) \t\t\t\t\tinf = m_doubleList[property.Name].setMetod; \t\t\t} \t\t\tif (inf != null) \t\t\t{ \t\t\t\tMethodBuilder custNameSetPropMthdBldr = \t\t\t\t\tm_TypeBuilder.DefineMethod(&quot;set_&quot; + property.Name, \t\t\t\t\t\t\t\t\t\t\t   m_getSetAttr, \t\t\t\t\t\t\t\t\t\t\t   null, \t\t\t\t\t\t\t\t\t\t\t   new Type[] { property.PropertyType }); \t\t\t\tILGenerator custNameSetIL = custNameSetPropMthdBldr.GetILGenerator(); \t\t\t\t\/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e  \t\t\t\tcustNameSetIL.Emit(OpCodes.Ldarg_0);\t\t\t \t\t\t\tif (fieldProperty != null) \t\t\t\t{ \t\t\t\t\tLocalBuilder loc = custNameSetIL.DeclareLocal(property.PropertyType); \t\t\t\t\tcustNameSetIL.Emit(OpCodes.Ldfld, fieldProperty); \t\t\t\t\tcustNameSetIL.Emit(OpCodes.Stloc_0); \t\t\t\t\t \t\t\t\t\tcustNameSetIL.Emit(OpCodes.Ldarg_0); \t\t\t\t\tcustNameSetIL.Emit(OpCodes.Ldarg_1); \t\t\t\t\t\/\/\u043f\u0440\u0438\u0441\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441\u0430\t\t\t\t\t\t\t\t \t\t\t\t\tcustNameSetIL.Emit(OpCodes.Stfld, fieldProperty); \t\t\t\t\tif (m_baseClass.GetInterface(&quot;iMatryoshkaCall&quot;) != null) \t\t\t\t\t{ \t\t\t\t\t\tMethodInfo simpleShow = typeof(iMatryoshkaCall).GetMethod(&quot;CallPropertyChange&quot;); \t\t\t\t\t\t\/\/CallPropertyChange(string propertyName, object CommandID = null, object oldData = null, object newData = null) \t\t\t\t\t\tif (simpleShow != null) \t\t\t\t\t\t{ \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Ldarg_0);  \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Ldstr, property.Name); \t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Ldc_I4_0); \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Box, typeof(int));  \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Ldloc_0); \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Box, property.PropertyType);  \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Ldarg_0); \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Ldfld, fieldProperty); \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Box, property.PropertyType);\t\t\t\t\t\t \t\t\t\t\t\t\t \t\t\t\t\t\t\tcustNameSetIL.Emit(OpCodes.Callvirt, simpleShow); \t\t\t\t\t\t} \t\t\t\t\t} \t\t\t \t\t\t\t}\t \t\t\t\tcustNameSetIL.Emit(OpCodes.Ret); \t\t\t\tcustNamePropBldr.SetSetMethod(custNameSetPropMthdBldr); \t\t\t\tm_TypeBuilder.DefineMethodOverride(custNameSetPropMthdBldr, inf); \t\t\t} \t\t\t#endregion \t\t} <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>\u0418\u0437 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439:<\/b><\/p>\n<p>  \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445: \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443(dll), \u0447\u0435\u0440\u0435\u0437 BuilderClassesPropertyAttribyte \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 <a href=\"https:\/\/msdn.microsoft.com\/ru-ru\/library\/system.attribute(v=vs.110).aspx\">Attribute<\/a> \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0443 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>  <b>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c:<\/b><\/p>\n<p>  \u0414\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432.\u041e\u0447\u0435\u043d\u044c \u043c\u043d\u0435 \u0443\u0436 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u043f\u043e\u0441\u043b\u0435 \u0421++ \u044d\u0442\u043e\u0433\u043e.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/316238\/\"> https:\/\/habrahabr.ru\/post\/316238\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<h4>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u044b\u0442, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043b\u0435\u043d\u0438<\/h4>\n<p>  \u0413\u043e\u0434\u0430 \u0442\u0440\u0438 \u043d\u0430\u0437\u0430\u0434, \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u0444\u0438\u0440\u043c\u0443. \u0411\u044b\u043b\u043e \u043d\u0430\u0441 4 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430. \u041e\u0434\u0438\u043d \u043f\u0438\u0441\u0430\u043b \u0431\u0438\u0437\u043d\u0435\u0441 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u043e\u043d \u0435\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 (interface). \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0432\u044f\u0437\u0438, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0442. \u0434. \u041d\u0430\u0448\u0430 \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441 GUI. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0431\u044b\u043b\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441\u0432\u044f\u0437\u0435\u0439 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c.<\/p>\n<p>  \u042f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0435\u043d\u0438\u0432\u044b\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u0430 \u043c\u044b\u0441\u043b\u044c \u2014 \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f, \u043a\u0430\u043a \u043d\u0438\u0431\u0443\u0434\u044c \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0418 \u044f \u0441\u0435\u043b \u0437\u0430 \u043a\u043d\u0438\u0436\u043a\u0438.<\/p>\n<p>  <b>\u0428\u0430\u0433 \u043f\u0435\u0440\u0432\u044b\u0439<\/b><\/p>\n<p>  \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0434\u0435\u044f \u0431\u044b\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u0430 \u044f\u0432\u043d\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u0430. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u2014 \u0442\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0438\u0445 \u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0444\u0430\u0439\u043b \u0441\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c. \u0422\u0430\u043a \u0438 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e. <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0442\u0435\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u043e\u0441\u044c, \u043d\u043e \u0435\u0441\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433, \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c(\u043a\u043b\u0430\u0441\u0441\u044b \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445)<\/b><\/p>\n<div class=\"spoiler_text\">\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-281618","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/281618","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=281618"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/281618\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=281618"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=281618"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=281618"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}