Использование замыканий
От: AlexDP Украина  
Дата: 09.09.10 11:17
Оценка:
Есть три таких метода (на самом деле их может быть еще больше.)

private void bExportExcel_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            TableView viewToWorkWith = GetViewToExportOrPrint();
            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.FileName = "Document"; // Default file name
            dlg.DefaultExt = ".xls"; // Default file extension
            dlg.Filter = ".xls|*.xls"; // Filter files by extension

            Nullable<bool> result = dlg.ShowDialog();

            // Process save file dialog box results
            if (result == true)
            {
                // Save document
                string filename = dlg.FileName;

                viewToWorkWith.ExportToXls(filename, new DevExpress.XtraPrinting.XlsExportOptions());

            }
        }

        private void bExportHtml_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            TableView viewToWorkWith = GetViewToExportOrPrint();
            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.FileName = "Document"; // Default file name
            dlg.DefaultExt = ".html"; // Default file extension
            dlg.Filter = ".html|*.html"; // Filter files by extension

            Nullable<bool> result = dlg.ShowDialog();

            // Process save file dialog box results
            if (result == true)
            {
                // Save document
                string filename = dlg.FileName;

                viewToWorkWith.ExportToHtml(filename, new DevExpress.XtraPrinting.HtmlExportOptions());

            }
        }

        private void bExportPdf_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            TableView viewToWorkWith = GetViewToExportOrPrint();
            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.FileName = "Document"; // Default file name
            dlg.DefaultExt = ".pdf"; // Default file extension
            dlg.Filter = ".pdf|*.pdf"; // Filter files by extension

            Nullable<bool> result = dlg.ShowDialog();

            // Process save file dialog box results
            if (result == true)
            {
                // Save document
                string filename = dlg.FileName;

                viewToWorkWith.ExportToPdf(filename, new DevExpress.XtraPrinting.PdfExportOptions());

            }


Как-то можно их отрефакторить, чтобы был один базовый метод, который бы и вызывался три раза с разными параметрами?

Сложность тут в том, что методы типа viewToWorkWith.ExportToPdf(filename, new DevExpress.XtraPrinting.PdfExportOptions()); отличаются сигнатурой и filename становится известным слишком поздно .
Re: Использование замыканий
От: Uzzy Россия  
Дата: 09.09.10 11:24
Оценка:
Здравствуйте, AlexDP, Вы писали:

как-то так
        private void Export(string extension, Action<string> export)
        {
            TableView viewToWorkWith = GetViewToExportOrPrint();
            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.FileName = "Document"; // Default file name
            dlg.DefaultExt = string.Format(".{0}", extension); // Default file extension
            dlg.Filter = string.Format(".{0}|*.{0}", extension); // Filter files by extension

            Nullable<bool> result = dlg.ShowDialog();

            // Process save file dialog box results
            if (result == true)
            {
                // Save document
                string filename = dlg.FileName;

                export(filename);
            }
        }
Re: Использование замыканий
От: Nuseraro Россия  
Дата: 09.09.10 11:28
Оценка: 2 (1)
Здравствуйте, AlexDP, Вы писали:

ADP>Есть три таких метода (на самом деле их может быть еще больше.)


ADP>Как-то можно их отрефакторить, чтобы был один базовый метод, который бы и вызывался три раза с разными параметрами?


ADP>Сложность тут в том, что методы типа viewToWorkWith.ExportToPdf(filename, new DevExpress.XtraPrinting.PdfExportOptions()); отличаются сигнатурой и filename становится известным слишком поздно .


В студии не тестил, но как-то так?

ADP>
ADP>private void HandleEvent<T>(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e, Action<string,T> callback, T callbackOptions)
ADP>{
ADP>            TableView viewToWorkWith = GetViewToExportOrPrint();
ADP>            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
ADP>            dlg.FileName = "Document"; // Default file name
ADP>            dlg.DefaultExt = ".xls"; // Default file extension
ADP>            dlg.Filter = ".xls|*.xls"; // Filter files by extension
ADP>            Nullable<bool> result = dlg.ShowDialog();
ADP>            // Process save file dialog box results
ADP>            if (result == true)
ADP>            {
ADP>                // Save document
ADP>                string filename = dlg.FileName;
ADP>                callback(filename, callbackOptions);
ADP>            }
ADP>}
ADP>private void bExportExcel_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
ADP>{
ADP>            HandleEvent(sender, e, viewToWorkWith.ExportToXls, new DevExpress.XtraPrinting.XlsExportOptions());
ADP>}
ADP>
Homo Guglens
Re[2]: Использование замыканий
От: AlexDP Украина  
Дата: 09.09.10 12:02
Оценка:
Здравствуйте, Nuseraro, Вы писали:

N>Здравствуйте, AlexDP, Вы писали:


ADP>>Есть три таких метода (на самом деле их может быть еще больше.)


ADP>>Как-то можно их отрефакторить, чтобы был один базовый метод, который бы и вызывался три раза с разными параметрами?


ADP>>Сложность тут в том, что методы типа viewToWorkWith.ExportToPdf(filename, new DevExpress.XtraPrinting.PdfExportOptions()); отличаются сигнатурой и filename становится известным слишком поздно .


N>В студии не тестил, но как-то так?


ADP>>
ADP>>private void HandleEvent<T>(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e, Action<string,T> callback, T callbackOptions)
ADP>>{
ADP>>            TableView viewToWorkWith = GetViewToExportOrPrint();
ADP>>            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
ADP>>            dlg.FileName = "Document"; // Default file name
ADP>>            dlg.DefaultExt = ".xls"; // Default file extension
ADP>>            dlg.Filter = ".xls|*.xls"; // Filter files by extension
ADP>>            Nullable<bool> result = dlg.ShowDialog();
ADP>>            // Process save file dialog box results
ADP>>            if (result == true)
ADP>>            {
ADP>>                // Save document
ADP>>                string filename = dlg.FileName;
ADP>>                callback(filename, callbackOptions);
ADP>>            }
ADP>>}
ADP>>private void bExportExcel_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
ADP>>{
ADP>>            HandleEvent(sender, e, viewToWorkWith.ExportToXls, new DevExpress.XtraPrinting.XlsExportOptions());
ADP>>}
ADP>>


Красиво, но viewToWorkWith должен определяться внутри HandleEvent

А что если будет viewToWorkWith.ExportToXls(filename); т.е. без дополнительных параметров.

Сорри, я об этом сразу не написал, а львиная доля использований именно такая будет.
Можно конечно скопипастить еще один такой же похожий метод...

Спасибо.
Re[2]: Использование замыканий
От: AlexDP Украина  
Дата: 09.09.10 12:06
Оценка:
Здравствуйте, Uzzy, Вы писали:

U>Здравствуйте, AlexDP, Вы писали:


U>как-то так

U>
U>        private void Export(string extension, Action<string> export)
U>        {
U>            TableView viewToWorkWith = GetViewToExportOrPrint();
U>            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
U>            dlg.FileName = "Document"; // Default file name
U>            dlg.DefaultExt = string.Format(".{0}", extension); // Default file extension
U>            dlg.Filter = string.Format(".{0}|*.{0}", extension); // Filter files by extension

U>            Nullable<bool> result = dlg.ShowDialog();

U>            // Process save file dialog box results
U>            if (result == true)
U>            {
U>                // Save document
U>                string filename = dlg.FileName;

U>                export(filename);
U>            }
U>        }
U>


И как все это будет вызываться?

Я так понял различные типы параметров Вы не учли.

Параметризация расширений не важна (dlg.DefaultExt = ".xls"), с этим как-нибудь справлюсь
Re[3]: Использование замыканий
От: Uzzy Россия  
Дата: 09.09.10 12:27
Оценка: 3 (1)
Здравствуйте, AlexDP, Вы писали:

        private void Export(string extension, Action<TableView, string> export)
        {
            TableView viewToWorkWith = GetViewToExportOrPrint();
            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.FileName = "Document"; // Default file name
            dlg.DefaultExt = string.Format(".{0}", extension); // Default file extension
            dlg.Filter = string.Format(".{0}|*.{0}", extension); // Filter files by extension

            Nullable<bool> result = dlg.ShowDialog();

            // Process save file dialog box results
            if (result == true)
            {
                // Save document
                string filename = dlg.FileName;

                export(viewToWorkWith, filename);
            }
        }

        private void OnClick()
        {
            Export("xls", (tv, fileName) => tv.ExportToXls(filename, new DevExpress.XtraPrinting.XlsExportOptions()));
        }
Re[4]: Использование замыканий
От: AlexDP Украина  
Дата: 09.09.10 12:51
Оценка:
Здравствуйте, Uzzy, Вы писали:

U>Здравствуйте, AlexDP, Вы писали:


U>
U>        private void Export(string extension, Action<TableView, string> export)
U>        {
U>            TableView viewToWorkWith = GetViewToExportOrPrint();
U>            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
U>            dlg.FileName = "Document"; // Default file name
U>            dlg.DefaultExt = string.Format(".{0}", extension); // Default file extension
U>            dlg.Filter = string.Format(".{0}|*.{0}", extension); // Filter files by extension

U>            Nullable<bool> result = dlg.ShowDialog();

U>            // Process save file dialog box results
U>            if (result == true)
U>            {
U>                // Save document
U>                string filename = dlg.FileName;

U>                export(viewToWorkWith, filename);
U>            }
U>        }

U>        private void OnClick()
U>        {
U>            Export("xls", (tv, fileName) => tv.ExportToXls(filename, new DevExpress.XtraPrinting.XlsExportOptions()));
U>        }

U>


Спасибо, это почти оно.

А что если будет viewToWorkWith.ExportToXls(filename); т.е. без дополнительных параметров?

Сорри, я об этом сразу не написал, а львиная доля использований именно такая будет.
Re[5]: Использование замыканий
От: AlexDP Украина  
Дата: 09.09.10 12:53
Оценка:
Здравствуйте, AlexDP, Вы писали:

ADP>Здравствуйте, Uzzy, Вы писали:


U>>Здравствуйте, AlexDP, Вы писали:


U>>
U>>        private void Export(string extension, Action<TableView, string> export)
U>>        {
U>>            TableView viewToWorkWith = GetViewToExportOrPrint();
U>>            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
U>>            dlg.FileName = "Document"; // Default file name
U>>            dlg.DefaultExt = string.Format(".{0}", extension); // Default file extension
U>>            dlg.Filter = string.Format(".{0}|*.{0}", extension); // Filter files by extension

U>>            Nullable<bool> result = dlg.ShowDialog();

U>>            // Process save file dialog box results
U>>            if (result == true)
U>>            {
U>>                // Save document
U>>                string filename = dlg.FileName;

U>>                export(viewToWorkWith, filename);
U>>            }
U>>        }

U>>        private void OnClick()
U>>        {
U>>            Export("xls", (tv, fileName) => tv.ExportToXls(filename, new DevExpress.XtraPrinting.XlsExportOptions()));
U>>        }

U>>


ADP>Спасибо, это почти оно.


ADP>А что если будет viewToWorkWith.ExportToXls(filename); т.е. без дополнительных параметров?


ADP>Сорри, я об этом сразу не написал, а львиная доля использований именно такая будет.


Сорри, туплю что-то сегодня
Это именно то, что я ожидал.
Я уж думал, что такую конструкцию не написать на шарпе .
Re[5]: Использование замыканий
От: Jolly Roger  
Дата: 09.09.10 14:52
Оценка:
Здравствуйте, AlexDP, Вы писали:

ADP>А что если будет viewToWorkWith.ExportToXls(filename); т.е. без дополнительных параметров?


ADP>Сорри, я об этом сразу не написал, а львиная доля использований именно такая будет.


Если действительно часто используется, то я-бы, вероятно, сделал-бы вроде такого(эскиз на коленке)

public static class ExportManager
{
    private struct RegEntry
    {
        public MethodInfo Method;
        public object Options;
    }
    private static Dictionary<string, RegEntry> RegEntries
        = new Dictionary<string, RegEntry>();

    public static void RegisterFormat(string Extension, string Method, object Options)
    {
        var entry = new RegEntry();
        entry.Method = typeof(TableView).GetMethod(Method,  new Type[]{typeof(string), Options.GetType()});
        entry.Options = Options;
        RegEntries.Add(Extension, entry);
    }

    public static void Export(string FileName)
    {
        TableView viewToWorkWith = GetViewToExportOrPrint();
        Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
        dlg.FileName = "Document"; // Default file name
        dlg.DefaultExt = Path.GetExtension(FileName);
        dlg.Filter = string.Format("{0}|*.{0}", DefaultExt);

        if (!dlg.ShowDialog()) return;

        var entry = RegEntries[DefaultExt];
        entry.Method.Invoke(viewToWorkWith, new object[] {dlg.FileName, entry.Options });
    }
}

Исключения и типизация Options — по вкусу
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.