Доброе время суток
В "наследство" достались 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# ?
Спасибо
Здравствуйте, Аноним, Вы писали:
Аналог 'on error resume next' будет выглядеть так:
try
{
Сsharp.Value = comObj.Value
}
catch(SomeCOMException){}
По поводу того насколько это красиво — это не красиво. Но иногда приходится так делать.
Здравствуйте, 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){}
как я понимаю от подобного неизбавиться
?
Здравствуйте, Аноним, Вы писали:
А>как я понимаю от подобного неизбавиться ?
Напишите часть кода на VB.NET, там есть деректива
On Error Resume Next
Здравствуйте, Аноним, Вы писали:
. . .
А>как я понимаю от подобного неизбавиться ?
Избавиться можно, но стоит ли...
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; });
* */
}
}
Здравствуйте, 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 — воидный делегат просто.