on error resume next С#?
От: Аноним  
Дата: 06.11.07 10:48
Оценка:
Доброе время суток

В "наследство" достались COM библиотеки
В коде С# есть следующее
Сsharp.ID = comObj.ID
Сsharp.Name = comObj.Name
...
...
Сsharp.Value = comObj.Value

т.е. свойства класса Сsharp(C#) заполняются из свойств comObj (COM Vb6) их ~8-12

Иногда при доступе к свойству comObj возникает COM исключение
которое можно проигнорировать и перейти дальше.
На VB это выглядело включением 'on error resume next' Как это правильно и красиво сделать на C# ?

Спасибо
Re: on error resume next С#?
От: stump http://stump-workshop.blogspot.com/
Дата: 06.11.07 10:52
Оценка:
Здравствуйте, Аноним, Вы писали:

Аналог 'on error resume next' будет выглядеть так:
try
{
Сsharp.Value = comObj.Value
}
catch(SomeCOMException){}

По поводу того насколько это красиво — это не красиво. Но иногда приходится так делать.
Понедельник начинается в субботу
Re[2]: on error resume next С#?
От: Аноним  
Дата: 06.11.07 11:35
Оценка:
Здравствуйте, stump, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


S>Аналог 'on error resume next' будет выглядеть так:

S>
S>try
S>{
S>Сsharp.Value = comObj.Value
S>}
S>catch(SomeCOMException){}
S>

S>По поводу того насколько это красиво — это не красиво. Но иногда приходится так делать.

это понятно! но возникает следующий код:
try
{
Сsharp.ID = comObj.ID
}
catch(SomeCOMException){}

try
{
Сsharp.Name = comObj.Name
}
catch(SomeCOMException){}

...
...
try
{
Сsharp.Value = comObj.Value
}
catch(SomeCOMException){}


как я понимаю от подобного неизбавиться ?
Re[3]: on error resume next С#?
От: Аноним  
Дата: 06.11.07 13:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>как я понимаю от подобного неизбавиться ?


Напишите часть кода на VB.NET, там есть деректива
On Error Resume Next
Re[3]: on error resume next С#?
От: Andrew_ImP  
Дата: 06.11.07 13:46
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:
. . .
А>как я понимаю от подобного неизбавиться ?

Избавиться можно, но стоит ли...

public class Program
{
    delegate X Accessor<X>();

    static void SafeSet<X>(ref X x, Accessor<X> y)
    {
        try
        {
            x = y();
        }
        catch 
        {
            //... do something.
        }
    }

    class Foo
    {
        public int X
        {
            get { throw new ArgumentException(); }
            set { }
        }
    }
    static void Main(string[] args)
    {
        int x = 0;
        Foo foo = new Foo();
        SafeSet(ref x, delegate() { return foo.X; });
/*
        SafeSet(ref Сsharp.ID, delegate() { return comObj.ID; });
        SafeSet(ref Сsharp.Name, delegate() { return comObj.Name; });
        SafeSet(ref Сsharp.Value, delegate() { return comObj.Value; });
 * */
    }
}
Re[4]: on error resume next С#?
От: Pavel M. Россия  
Дата: 06.11.07 14:22
Оценка: +1
Здравствуйте, Andrew_ImP, Вы писали:

A_I>Здравствуйте, Аноним, Вы писали:

A_I>. . .
А>>как я понимаю от подобного неизбавиться ?

A_I>Избавиться можно, но стоит ли...


A_I>
A_I>public class Program
A_I>{
A_I>    delegate X Accessor<X>();

A_I>    static void SafeSet<X>(ref X x, Accessor<X> y)
A_I>    {
A_I>        try
A_I>        {
A_I>            x = y();
A_I>        }
A_I>        catch 
A_I>        {
A_I>            //... do something.
A_I>        }
A_I>    }

A_I>    class Foo
A_I>    {
A_I>        public int X
A_I>        {
A_I>            get { throw new ArgumentException(); }
A_I>            set { }
A_I>        }
A_I>    }
A_I>    static void Main(string[] args)
A_I>    {
A_I>        int x = 0;
A_I>        Foo foo = new Foo();
A_I>        SafeSet(ref x, delegate() { return foo.X; });
A_I>/*
A_I>        SafeSet(ref Сsharp.ID, delegate() { return comObj.ID; });
A_I>        SafeSet(ref Сsharp.Name, delegate() { return comObj.Name; });
A_I>        SafeSet(ref Сsharp.Value, delegate() { return comObj.Value; });
A_I> * */
A_I>    }
A_I>}
A_I>



А зачем так сложно?

можно без генериков просто дергать воидный делегат

 SetProperty((ThreadStart)delegate { this.Id = comObj.Id; } )
 SetProperty((ThreadStart)delegate { this.Caption = comObj.Caption; } )


видимость позволяет, генерики не нужны. ThreadStart — воидный делегат просто.
--------------------------
less think — do more
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.