Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вынос части кода в другой класс в C# / 25 сообщений из 41, страница 1 из 2
17.10.2019, 10:00
    #39877447
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Добрый день,

Помогите чайнику. Есть такой класс: XeroExport.cs. В нем очень много кода. Он выглядит примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
namespace Export
{
    public class XeroExport: ApiWrapper
    {
        public void ExcelExport()
        {
            DateTime startDate = DateTime.ParseExact(ConfigurationManager.AppSettings["PeriodStart"], "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture);
            DateTime endDate = DateTime.ParseExact(ConfigurationManager.AppSettings["PeriodEnd"], "yyyy-MM-dd HH:mm:ss,fff", System.Globalization.CultureInfo.InvariantCulture);
            Call_BalanceSheet(startDate, endDate);
        }
        private List<InvoiceTableRow> converZInvouice(Invoice invoice)
        {
        }
        private String convertInvoiceToString(Invoice invoice)
        {
        }
        private void saveInvoices(string filename, List<Invoice> invoices)
        {
        }
        private void GetInvoices()
        {
        }
        private int GetTotalInvoiceCount()
        {
        }
        private int GetTotalContactCount()
        {
        }
        private int GetTotalJournalCount()
        {
        }
        public int CheckReportStatus(string ReportName)
        {
            ...  
            return ReportStatus;
        }
        private void Call_BalanceSheet(DateTime periodStart, DateTime periodEnd)
        {
            int reportStatus = CheckReportStatus("Balance Sheet");
            if (reportStatus == 1)
            {
                 ...
                 Insert_BalanceSheet(monthStartDate, monthEndDate, reportDate);
                 ...
            }
        }
        private void Insert_BalanceSheet(DateTime periodStart, DateTime periodEnd, DateTime runDate)
        {
            ...   
            var pal = Api.Reports.BalanceSheet(periodStart, null, null, false, null, null, null);
        }
    }
}



Я хочу методы Call_BalanceSheet и Insert_BalanceSheet вынести в отдельный класс: BalanceSheet.cs:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using Xero.Api.Example.MVC.Helpers;

namespace Export
{

    public class BalanceSheet
    {
        private void Call_BalanceSheet(DateTime periodStart, DateTime periodEnd)
        {
            int reportStatus = CheckReportStatus("Balance Sheet");
            if (reportStatus == 1)
            {
               ... 
               Insert_BalanceSheet(monthStartDate, monthEndDate, reportDate);
            }
        }
        private void Insert_BalanceSheet(DateTime periodStart, DateTime periodEnd, DateTime runDate)
        {
             ....
             var pal = Api.Reports.BalanceSheet(periodStart, null, null, false, null, null, null);
        }
    }

}



После того как я это делаю, XeroExport.cs не находит Call_BalanceSheet, BalanceSheet.cs не находит CheckReportStatus и Api.

Как сделать так, чтобы они видели методы друг друга?

Не ругайте сильно, опыта программирования у меня не много.

Спасибо.
...
Рейтинг: 0 / 0
17.10.2019, 10:37
    #39877476
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Конечно, не найдет. Они же у тебя как private объявлены.
...
Рейтинг: 0 / 0
17.10.2019, 10:43
    #39877484
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Вообще, если зашла речь о такой декомпозиции, то тебе лучше сразу изучить про "Dependency Injection" и делать все это по SOLID. Могу посоветовать вот такую книгу: Марк Симан: Внедрение зависимостей в .NET
...
Рейтинг: 0 / 0
17.10.2019, 10:48
    #39877490
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Похоже немного разобрался как достучаться до Call_BalanceSheet и CheckReportStatus:
В ExcelExport создать переменную:
Код: c#
1.
2.
3.
            
var balancesheet = new BalanceSheet();
balancesheet.Call_BalanceSheet(startDate, endDate);



И также в BalanceSheet:
Код: c#
1.
2.
var checkReportStatus = new XeroExport();        
int reportStatus = checkReportStatus.CheckReportStatus("Balance Sheet");



А вот с Api никак.

Скопировал в BalanceSheet.cs все "using" из XeroExport.cs:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;
using Xero.Api.Core.Model;
using Xero.Api.Core;
using Xero.Api.Payroll.Australia.Model;
using System.Linq;



Все равно не работает.
...
Рейтинг: 0 / 0
17.10.2019, 10:52
    #39877499
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
fkthatКонечно, не найдет. Они же у тебя как private объявлены.

Это я исправил.
...
Рейтинг: 0 / 0
17.10.2019, 11:01
    #39877510
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
А вот с Api не могу разобраться. Она в другом проекте. Почему-то XeroExport.cs ее видит, а вот BalanceSheet.cs - нет.
...
Рейтинг: 0 / 0
17.10.2019, 11:07
    #39877518
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Roust_mА вот с Api не могу разобраться. Она в другом проекте. Почему-то XeroExport.cs ее видит, а вот BalanceSheet.cs - нет.
Наверное проект не добавлен в "References". В Solution Explorer правый клик по "Dependencies", потом "Add reference -> Solution" и поставить галку на нужный проект.
...
Рейтинг: 0 / 0
17.10.2019, 11:34
    #39877558
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
fkthatRoust_mА вот с Api не могу разобраться. Она в другом проекте. Почему-то XeroExport.cs ее видит, а вот BalanceSheet.cs - нет.
Наверное проект не добавлен в "References". В Solution Explorer правый клик по "Dependencies", потом "Add reference -> Solution" и поставить галку на нужный проект.

Но ведь это на уровне проекта? XeroExport.cs и BalanceSheet.cs - в одном проекте и даже в одном namespace. Api - в другом проекте.

Почему XeroExport.cs видит Api, а BalanceSheet.cs - не видит?
...
Рейтинг: 0 / 0
17.10.2019, 11:36
    #39877562
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
А solution - один на всех
...
Рейтинг: 0 / 0
17.10.2019, 11:37
    #39877564
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Roust_mfkthatпропущено...

Наверное проект не добавлен в "References". В Solution Explorer правый клик по "Dependencies", потом "Add reference -> Solution" и поставить галку на нужный проект.

Но ведь это на уровне проекта? XeroExport.cs и BalanceSheet.cs - в одном проекте и даже в одном namespace. Api - в другом проекте.

Почему XeroExport.cs видит Api, а BalanceSheet.cs - не видит?

потому что (покажите этот класс):
Код: c#
1.
public class XeroExport: ApiWrapper
...
Рейтинг: 0 / 0
17.10.2019, 11:38
    #39877566
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Roust_mНо ведь это на уровне проекта? XeroExport.cs и BalanceSheet.cs - в одном проекте и даже в одном namespace. Api - в другом проекте.
Почему XeroExport.cs видит Api, а BalanceSheet.cs - не видит?
C using-ами все ок?
...
Рейтинг: 0 / 0
17.10.2019, 11:39
    #39877567
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Можно сделать partial class, раз уж размер исходника так смущает.
...
Рейтинг: 0 / 0
17.10.2019, 11:46
    #39877571
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Konst_OneRoust_mпропущено...


Но ведь это на уровне проекта? XeroExport.cs и BalanceSheet.cs - в одном проекте и даже в одном namespace. Api - в другом проекте.

Почему XeroExport.cs видит Api, а BalanceSheet.cs - не видит?

потому что (покажите этот класс):
Код: c#
1.
public class XeroExport: ApiWrapper



А где его показать? В BalanceSheet.cs?
...
Рейтинг: 0 / 0
17.10.2019, 11:47
    #39877574
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
fkthatRoust_mНо ведь это на уровне проекта? XeroExport.cs и BalanceSheet.cs - в одном проекте и даже в одном namespace. Api - в другом проекте.
Почему XeroExport.cs видит Api, а BalanceSheet.cs - не видит?
C using-ами все ок?

Да, юзинги одинаковые у обоих классов.
...
Рейтинг: 0 / 0
17.10.2019, 11:49
    #39877577
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Konst_OneRoust_mпропущено...


Но ведь это на уровне проекта? XeroExport.cs и BalanceSheet.cs - в одном проекте и даже в одном namespace. Api - в другом проекте.

Почему XeroExport.cs видит Api, а BalanceSheet.cs - не видит?

потому что (покажите этот класс):
Код: c#
1.
public class XeroExport: ApiWrapper



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
   public class ApiWrapper
    {
        public ApiWrapper()
        {
            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
        }

        private IXeroCoreApi _api;
        protected IXeroCoreApi Api
        {
            get { return _api ?? (_api = CreateCoreApi()); }
        }

        private static IXeroCoreApi CreateCoreApi()
        {
            return new Xero.Api.Example.Applications.Private.Core
            {
                UserAgent = "Xero Api - Integration tests"
            };
        }

    }
...
Рейтинг: 0 / 0
17.10.2019, 11:51
    #39877579
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Сон Веры ПавловныМожно сделать partial class, раз уж размер исходника так смущает.
Ага. При желании, можно вообще все приложение сделать как один большой partial класс. А при большом желании можно и хер сломать, хоть он и без костей. Как будто приложение по классам разбивают только чтобы отдельные файлы исходников поменьше были.
...
Рейтинг: 0 / 0
17.10.2019, 11:53
    #39877580
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Сон Веры ПавловныМожно сделать partial class, раз уж размер исходника так смущает.

Это интересная идея, почитаю на эту тему. А то я замучался связывать эти классы. А кода действительно много, пока долистаешь до нужного класса...
...
Рейтинг: 0 / 0
17.10.2019, 11:54
    #39877582
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
fkthatСон Веры ПавловныМожно сделать partial class, раз уж размер исходника так смущает.
Ага. При желании, можно вообще все приложение сделать как один большой partial класс. А при большом желании можно и хер сломать, хоть он и без костей. Как будто приложение по классам разбивают только чтобы отдельные файлы исходников поменьше были.

Мне такие высоты рано пока. Мне просто для удобства. Слишком много исходника на одном файле.
...
Рейтинг: 0 / 0
17.10.2019, 12:11
    #39877598
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Roust_mЭто интересная идея, почитаю на эту тему. А то я замучался связывать эти классы. А кода действительно много, пока долистаешь до нужного класса...
Паршиал классы придумали для вполне определенной цели - разнести по разным файлам сгенеренную каким-либо генератором часть класса и ту часть класса, которая пишется руками. Использовать их для чего-то другого нафиг не следует. Если твой класс большой, то его просто надо разбивать на несколько. Листать по классам, в чем проблема-то - "F12" ("Go to definition") и попадаешь сразу в нужное тебе место. Можно и в обратную сторону - "Find all references" - и сразу видишь что и где какой-либо твой код вызывает.
...
Рейтинг: 0 / 0
17.10.2019, 12:40
    #39877633
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
fkthatКак будто приложение по классам разбивают только чтобы отдельные файлы исходников поменьше были.
Ну, исходя из стартового постинга, ТС хочет разбить на классы именно по этой причине.
...
Рейтинг: 0 / 0
17.10.2019, 14:06
    #39877705
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
Сон Веры Павловны,

Спасибо, очень хорошо получилось, гораздо легче работать стало.
...
Рейтинг: 0 / 0
17.10.2019, 17:07
    #39877815
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
К слову, в части реализации винформсового DataGridView (причем не похоже, что это автосгенеренный код) 29999 строк. И ничего, писали как-то люди, работали с этим.
...
Рейтинг: 0 / 0
17.10.2019, 22:16
    #39877934
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
fkthatПаршиал классы придумали для вполне определенной цели - разнести по разным файлам сгенеренную каким-либо генератором часть класса и ту часть класса, которая пишется руками. Использовать их для чего-то другого нафиг не следует. Если твой класс большой, то его просто надо разбивать на несколько.
То же самое когда-то говорилось и о регионах (regions). Хотите сказать, не используете их?
...
Рейтинг: 0 / 0
17.10.2019, 22:32
    #39877939
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
LRТо же самое когда-то говорилось и о регионах (regions). Хотите сказать, не используете их?
Нет. А зачем? Если класс большой, то наверняка он нарушает принцип "Single responsibility" и его надо просто разбивать на меньшие. А регионы - это просто разновидность комментариев, с тем отличием, что их сворачивать можно в IDE. Функциональной роли они никакой не играют.
...
Рейтинг: 0 / 0
17.10.2019, 23:33
    #39877954
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вынос части кода в другой класс в C#
fkthatНет. А зачем? Если класс большой, то наверняка он нарушает принцип "Single responsibility" и его надо просто разбивать на меньшие. А регионы - это просто разновидность комментариев, с тем отличием, что их сворачивать можно в IDE. Функциональной роли они никакой не играют.
Т.е., для каждого класса свой файл-исходник? И если классов в проекте очень много - много и файлов. Но кому-то проще структурировать с помощью регионов в нескольких файлах. Партиал классы тоже можна использовать для структурирования (по интерфейсам/контрактам или по кодерам). Еще их иногда удобно использовать в сочетании с "Add As Link" (для нескольких проектов), это дает возможность избавится от необходимости создания отдельной сборки с базовым классом.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вынос части кода в другой класс в C# / 25 сообщений из 41, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]