MathOperationsWithGeneric

Проект показывает вариант использования Generic<T> классов

9/1/2019 7:58:01 PM

Details

.gitignore 9(+9 -0)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..df0ae75
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+
+ExpressionOperatorProxy/.vs/
+
+
+ExpressionOperatorProxy/ExpressionOperatorProxy/bin/
+ExpressionOperatorProxy/ExpressionOperatorProxy/obj/
+
+ExpressionOperatorProxy/ConsoleTest/bin/
+ExpressionOperatorProxy/ConsoleTest/obj/
diff --git a/ExpressionOperatorProxy/ConsoleTest/ConsoleTest.csproj b/ExpressionOperatorProxy/ConsoleTest/ConsoleTest.csproj
new file mode 100644
index 0000000..6ca0e44
--- /dev/null
+++ b/ExpressionOperatorProxy/ConsoleTest/ConsoleTest.csproj
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{79584C30-FC63-42C6-9D30-745B51C02AA2}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>ConsoleTest</RootNamespace>
+    <AssemblyName>ConsoleTest</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ExpressionOperatorProxy\ExpressionOperatorProxy.csproj">
+      <Project>{b9cca952-9128-4ce5-a0e2-f977ff567d34}</Project>
+      <Name>ExpressionOperatorProxy</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/ExpressionOperatorProxy/ConsoleTest/Program.cs b/ExpressionOperatorProxy/ConsoleTest/Program.cs
new file mode 100644
index 0000000..1341193
--- /dev/null
+++ b/ExpressionOperatorProxy/ConsoleTest/Program.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using ExpressionOperatorProxy.Generic.MathOperatorProxy;
+using ExpressionOperatorProxy.Generic.Collection;
+
+namespace ConsoleTest
+{
+    class Program
+    {
+
+        //OperatorProxy example
+        static void Test1()
+        {
+            var a = new OperatorProxy<int>(10);
+            var b = new OperatorProxy<int>(20);
+            var c = 2;
+
+            var res = a + b * c;
+            Console.WriteLine(res);
+        }
+
+        //Matrix example
+        static void Test2()
+        {
+            var m1 = new Matrix<int>(new List<List<int>>()
+            {
+                new List<int>(){ 1, 2, 3 },
+                new List<int>(){ 3, 2, 1 }
+            });
+
+            var m2 = new Matrix<int>(new List<List<int>>()
+            {
+                new List<int>(){ -1, -2, -3 },
+                new List<int>(){ 3, 2, 1 }
+            });
+
+            var res = m1 + m2;
+            Console.WriteLine(res);
+        }
+
+        class TestClass { }
+        //Error example
+        //TestClass not implement + operator
+        static void Test3()
+        {
+            var a = new OperatorProxy<TestClass>(new TestClass());
+            var b = new OperatorProxy<TestClass>(new TestClass());
+
+            var res = a + b;
+        }
+
+        static void Main(string[] args)
+        {
+            Test1();
+            Test2();
+            //Test3();
+        }
+    }
+}
diff --git a/ExpressionOperatorProxy/ConsoleTest/Properties/AssemblyInfo.cs b/ExpressionOperatorProxy/ConsoleTest/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..00f257b
--- /dev/null
+++ b/ExpressionOperatorProxy/ConsoleTest/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Общие сведения об этой сборке предоставляются следующим набором
+// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
+// связанные со сборкой.
+[assembly: AssemblyTitle("ConsoleTest")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ConsoleTest")]
+[assembly: AssemblyCopyright("Copyright ©  2019")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
+// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
+// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
+[assembly: ComVisible(false)]
+
+// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
+[assembly: Guid("79584c30-fc63-42c6-9d30-745b51c02aa2")]
+
+// Сведения о версии сборки состоят из следующих четырех значений:
+//
+//      Основной номер версии
+//      Дополнительный номер версии
+//   Номер сборки
+//      Редакция
+//
+// Можно задать все значения или принять номер сборки и номер редакции по умолчанию.
+// используя "*", как показано ниже:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ExpressionOperatorProxy/ExpressionOperatorProxy.sln b/ExpressionOperatorProxy/ExpressionOperatorProxy.sln
new file mode 100644
index 0000000..aadaecf
--- /dev/null
+++ b/ExpressionOperatorProxy/ExpressionOperatorProxy.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.28307.136
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExpressionOperatorProxy", "ExpressionOperatorProxy\ExpressionOperatorProxy.csproj", "{B9CCA952-9128-4CE5-A0E2-F977FF567D34}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleTest", "ConsoleTest\ConsoleTest.csproj", "{79584C30-FC63-42C6-9D30-745B51C02AA2}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{B9CCA952-9128-4CE5-A0E2-F977FF567D34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B9CCA952-9128-4CE5-A0E2-F977FF567D34}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B9CCA952-9128-4CE5-A0E2-F977FF567D34}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B9CCA952-9128-4CE5-A0E2-F977FF567D34}.Release|Any CPU.Build.0 = Release|Any CPU
+		{79584C30-FC63-42C6-9D30-745B51C02AA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{79584C30-FC63-42C6-9D30-745B51C02AA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{79584C30-FC63-42C6-9D30-745B51C02AA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{79584C30-FC63-42C6-9D30-745B51C02AA2}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {9B89A0E2-77F3-464F-859C-2BB9631A1B7D}
+	EndGlobalSection
+EndGlobal
diff --git a/ExpressionOperatorProxy/ExpressionOperatorProxy/ExpressionOperatorProxy.csproj b/ExpressionOperatorProxy/ExpressionOperatorProxy/ExpressionOperatorProxy.csproj
new file mode 100644
index 0000000..bed2421
--- /dev/null
+++ b/ExpressionOperatorProxy/ExpressionOperatorProxy/ExpressionOperatorProxy.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{B9CCA952-9128-4CE5-A0E2-F977FF567D34}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>ExpressionOperatorProxy</RootNamespace>
+    <AssemblyName>ExpressionOperatorProxy</AssemblyName>
+    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Generic\Collection\Matrix.cs" />
+    <Compile Include="Generic\MathOperatorProxy\OperatorProxy.cs" />
+    <Compile Include="Generic\MathOperatorProxy\StaticOperatorProxy.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/ExpressionOperatorProxy/ExpressionOperatorProxy/ExpressionOperatorProxy.csproj.user b/ExpressionOperatorProxy/ExpressionOperatorProxy/ExpressionOperatorProxy.csproj.user
new file mode 100644
index 0000000..6cbe588
--- /dev/null
+++ b/ExpressionOperatorProxy/ExpressionOperatorProxy/ExpressionOperatorProxy.csproj.user
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectView>ProjectFiles</ProjectView>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/ExpressionOperatorProxy/ExpressionOperatorProxy/Generic/Collection/Matrix.cs b/ExpressionOperatorProxy/ExpressionOperatorProxy/Generic/Collection/Matrix.cs
new file mode 100644
index 0000000..02d8eef
--- /dev/null
+++ b/ExpressionOperatorProxy/ExpressionOperatorProxy/Generic/Collection/Matrix.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using ExpressionOperatorProxy.Generic.MathOperatorProxy;
+
+namespace ExpressionOperatorProxy.Generic.Collection
+{
+    //Универсальная матрица
+    public class Matrix<T>
+    {
+        OperatorProxy<T>[][] _matrix;
+
+        public int Height => _matrix.Length;
+        public int Weight => Height != 0 
+            ? _matrix.First().Length 
+            : 0;
+
+
+        public Matrix(int Height, int weight)
+        {
+            _matrix = new OperatorProxy<T>[Height][];
+
+            foreach (var i in Enumerable.Range(0, Height))
+                _matrix[i] = new OperatorProxy<T>[weight];                
+        }
+        public Matrix(IEnumerable<IEnumerable<T>> data)
+        {
+           _matrix = data
+                .Select(e => 
+                    e.Select(e2 => 
+                        new OperatorProxy<T>(e2))
+                    .ToArray())
+                .ToArray();
+        }
+
+
+        public T this[int H, int W]
+        {
+            set => _matrix[H][W].Value = value;
+            get => _matrix[H][W].Value;
+        }
+
+        public static Matrix<T> operator +(Matrix<T> operator1, Matrix<T> operator2)
+        {
+            if (operator1.Height != operator2.Height
+                || operator1.Weight != operator2.Weight)
+                throw new Exception();
+
+            Matrix<T> res = new Matrix<T>(operator2.Height, operator2.Weight);
+
+            for (int i = 0; i < operator1.Height; i++)
+                for (int j = 0; j < operator1.Weight; j++)              
+                    res._matrix[i][j] = operator1._matrix[i][j] + operator2._matrix[i][j];                
+
+            return res;
+        }
+        public static Matrix<T> operator -(Matrix<T> operator1, Matrix<T> operator2)
+        {
+            if (operator1.Height != operator2.Height
+                || operator1.Weight != operator2.Weight)
+                throw new Exception();
+
+            Matrix<T> res = new Matrix<T>(operator2.Height, operator2.Weight);
+
+            for (int i = 0; i < operator1.Height; i++)
+                for (int j = 0; j < operator2.Weight; j++)
+                    res._matrix[i][j] = operator1._matrix[i][j] - operator2._matrix[i][j];
+
+            return res;
+        }
+
+
+        public override string ToString()
+        {
+            StringBuilder res = new StringBuilder();
+
+            foreach (var row in _matrix)
+            {
+                foreach (var elem in row)
+                    res.Append(elem + " ");
+                res.Append('\n');
+            }
+
+            return res.ToString();
+        }
+
+    }
+}
diff --git a/ExpressionOperatorProxy/ExpressionOperatorProxy/Generic/MathOperatorProxy/OperatorProxy.cs b/ExpressionOperatorProxy/ExpressionOperatorProxy/Generic/MathOperatorProxy/OperatorProxy.cs
new file mode 100644
index 0000000..950313f
--- /dev/null
+++ b/ExpressionOperatorProxy/ExpressionOperatorProxy/Generic/MathOperatorProxy/OperatorProxy.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ExpressionOperatorProxy.Generic.MathOperatorProxy
+{
+
+    //Обертка над StaticOperatorProxy для удобства использования
+    public struct OperatorProxy<T>
+    {
+        public T Value { set; get; }
+
+
+        public OperatorProxy(T value)
+        {
+            this.Value = value;
+        }
+
+
+        public static OperatorProxy<T> operator +(OperatorProxy<T> c1, T c2)
+        {
+            return new OperatorProxy<T>(StaticOperatorProxy<T>.Add(c1.Value, c2));
+        }
+        public static OperatorProxy<T> operator +(OperatorProxy<T> c1, OperatorProxy<T> c2)
+        {
+            return new OperatorProxy<T>(StaticOperatorProxy<T>.Add(c1.Value, c2.Value));
+        }
+
+        public static OperatorProxy<T> operator -(OperatorProxy<T> c1, T c2)
+        {
+            return new OperatorProxy<T>(StaticOperatorProxy<T>.Subtract(c1.Value, c2));
+        }
+        public static OperatorProxy<T> operator -(OperatorProxy<T> c1, OperatorProxy<T> c2)
+        {
+            return new OperatorProxy<T>(StaticOperatorProxy<T>.Subtract(c1.Value, c2.Value));
+        }
+
+        public static OperatorProxy<T> operator *(OperatorProxy<T> c1, T c2)
+        {
+            return new OperatorProxy<T>(StaticOperatorProxy<T>.Multiply(c1.Value, c2));
+        }
+        public static OperatorProxy<T> operator *(OperatorProxy<T> c1, OperatorProxy<T> c2)
+        {
+            return new OperatorProxy<T>(StaticOperatorProxy<T>.Multiply(c1.Value, c2.Value));
+        }
+
+        public static OperatorProxy<T> operator /(OperatorProxy<T> c1, T c2)
+        {
+            return new OperatorProxy<T>(StaticOperatorProxy<T>.Divide(c1.Value, c2));
+        }
+        public static OperatorProxy<T> operator /(OperatorProxy<T> c1, OperatorProxy<T> c2)
+        {
+            return new OperatorProxy<T>(StaticOperatorProxy<T>.Divide(c1.Value, c2.Value));
+        }
+
+
+        public override string ToString()
+        {
+            return Value.ToString();
+        }
+
+        public override int GetHashCode()
+        {
+            return Value.GetHashCode();
+        }
+
+        public override bool Equals(object obj)
+        {
+            return Value.Equals(obj);
+        }
+
+    }
+}
diff --git a/ExpressionOperatorProxy/ExpressionOperatorProxy/Generic/MathOperatorProxy/StaticOperatorProxy.cs b/ExpressionOperatorProxy/ExpressionOperatorProxy/Generic/MathOperatorProxy/StaticOperatorProxy.cs
new file mode 100644
index 0000000..81dba83
--- /dev/null
+++ b/ExpressionOperatorProxy/ExpressionOperatorProxy/Generic/MathOperatorProxy/StaticOperatorProxy.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using System.Linq.Expressions;
+
+namespace ExpressionOperatorProxy.Generic.MathOperatorProxy
+{
+
+    /// <summary>
+    /// Пример реализации взят с
+    /// http://www.cyberforum.ru/csharp-net/thread1994108.html
+    /// 
+    /// Позволяет производить арифметические операции над Generic T типом
+    /// Возможны ошибки, если используемый тип не реализует используемую операцию
+    /// Список операций можно расширить на основе возможностей класса Expression
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public static class StaticOperatorProxy<T>
+    {
+        private readonly static Func<T, T, T> _addOperator;
+        private readonly static Func<T, T, T> _subtractOperator;
+        private readonly static Func<T, T, T> _multiplyOperator;
+        private readonly static Func<T, T, T> _divideOperator;
+
+        private static Func<T, T, T> CreateDelegate(BinaryExpression expression, ParameterExpression parameter1, ParameterExpression parameter2)
+        {
+            return Expression
+                .Lambda<Func<T, T, T>>(
+                    expression,
+                    new[]
+                    {
+                        parameter1,
+                        parameter2
+                    }
+                ).Compile();
+        }
+
+        static StaticOperatorProxy()
+        {
+
+            var operand1 = Expression.Parameter(typeof(T), "o1");
+            var operand2 = Expression.Parameter(typeof(T), "o2");
+
+            var addCall = Expression.Add(operand1, operand2);
+            var subtractCall = Expression.Subtract(operand1, operand2);
+            var multiplyCall = Expression.Multiply(operand1, operand2);
+            var dividetractCall = Expression.Divide(operand1, operand2);
+
+            _addOperator = CreateDelegate(addCall, operand1, operand2);
+            _subtractOperator = CreateDelegate(subtractCall, operand1, operand2);
+            _multiplyOperator = CreateDelegate(multiplyCall, operand1, operand2);
+            _divideOperator = CreateDelegate(dividetractCall, operand1, operand2);
+        }
+
+
+        public static T Add(T operand1, T operand2)
+        {
+            return _addOperator(operand1, operand2);
+        }
+        public static T Subtract(T operand1, T operand2)
+        {
+            return _subtractOperator(operand1, operand2);
+        }
+        public static T Multiply(T operand1, T operand2)
+        {
+            return _multiplyOperator(operand1, operand2);
+        }
+        public static T Divide(T operand1, T operand2)
+        {
+            return _divideOperator(operand1, operand2);
+        }
+
+    }
+}
+
diff --git a/ExpressionOperatorProxy/ExpressionOperatorProxy/Properties/AssemblyInfo.cs b/ExpressionOperatorProxy/ExpressionOperatorProxy/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..005a5f1
--- /dev/null
+++ b/ExpressionOperatorProxy/ExpressionOperatorProxy/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// Общие сведения об этой сборке предоставляются следующим набором
+// набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
+// связанные со сборкой.
+[assembly: AssemblyTitle("ExpressionOperatorProxy")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ExpressionOperatorProxy")]
+[assembly: AssemblyCopyright("Copyright ©  2019")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
+// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
+// COM, задайте атрибуту ComVisible значение TRUE для этого типа.
+[assembly: ComVisible(false)]
+
+// Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM
+[assembly: Guid("b9cca952-9128-4ce5-a0e2-f977ff567d34")]
+
+// Сведения о версии сборки состоят из следующих четырех значений:
+//
+//      Основной номер версии
+//      Дополнительный номер версии
+//   Номер сборки
+//      Редакция
+//
+// Можно задать все значения или принять номер сборки и номер редакции по умолчанию.
+// используя "*", как показано ниже:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]