powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Использование System.Enum в .NET Gateway
3 сообщений из 3, страница 1 из 1
Использование System.Enum в .NET Gateway
    #37166072
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возьмем простой код из C# по созданию объекта сокета:
Код: plaintext
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Так как в Cache нет типа перечисления, то преобразуем этот код в следующий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// 1й вариант получения типа перечисления
AddressFamily tmpAddressFamily = new AddressFamily();
Type enumType = tmpAddressFamily.GetType();
// 2й вариант получения типа перечисления
Type enumType2 = Type.GetType("AddressFamily");
//
AddressFamily addressFamily = (AddressFamily)Enum.Parse(enumType, "InterNetwork");
//
Socket sock = new Socket(addressFamily, ...);
2й вариант не подходит, потому что при импорте System.Type в Cache не добавляется статический метод GetType(), т.к. у родительского класса System.Object есть метод объекта GetType(). (Одно из ограничений при использовании .NET Gateway.)

Пробуем сделать это же на Cache (2009.1.5):
Код: plaintext
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.
#include %systemInclude

TestSocket(port= 55000 ,host="127.0.0.1") PUBLIC
{
	s %objlasterror = "", $zt = "errTestSocket"
	s err = ""
	#; connect to current namespace, use  5  second timeout
	s namespace = $zu( 5 ), timeout =  5 
	#; get a connection handle and connect
	s gateway = ##class(%Net.Remote.Gateway).%New()
	s sc = gateway.%Connect(host,port,namespace,timeout)
	if $$$ISERR(sc)
	{
		s err = $SYSTEM.Status.GetErrorText(sc)
		g exitTestSocket
	}
	s fConnected =  1 
	#;
	#dim tmpObj As System.Net.Sockets.AddressFamily = ##class(System.Net.Sockets.AddressFamily).%New(gateway)
	#dim tmpType As System.Type = tmpObj.GetType()
	s tmpValue = ##class(System.Net.Sockets.AddressFamily).%GetParameter("InterNetwork")
	#dim addressFamily As System.Net.Sockets.AddressFamily = ##class(System.Enum).Parse(gateway, tmpType, tmpValue)
	#;
	#dim socket As System.Net.Sockets.Socket = ##class(System.Net.Sockets.Socket).%New(gateway, addressFamily, ...)
	#;
	...
	#;
	g exitTestSocket
	#;
errTestSocket
	s $zt = ""
	s err = $select((%objlasterror'=""):$SYSTEM.Status.GetErrorText(%objlasterror), 1:$ze)
	#;
exitTestSocket
	w:(err'="") "Error: "_err,!
	#; disconnect
	if ($d(gateway))
	{
		d:($g(fConnected, 0 )) gateway.%Disconnect()
		k gateway
	}
	#;
	q err
}

При выполнении получаем следующую ошибку на вызове ##class(System.Enum).Parse():
Error: ОШИБКА #5023: Ошибка Java Шлюза: Error caught by Gateway.executeOverloadedMethod
at InterSystems.Data.CacheClient.Gateway.Gateway.executeOverloadedMethod(ArrayList methods, String methodName, String oref)
at InterSystems.Data.CacheClient.Gateway.Gateway.executeMethod()
Type provided must be an Enum.
Parameter name: enumType
at System.Enum.Parse(Type enumType, String value, Boolean ignoreCase)

Если перед Parse() вывести tmpType.ToString(), то увидим "System.Object", хотя должно быть "System.Net.Sockets.AddressFamily", поэтому Parse() и ругается на тип объекта в первом аргументе.

Возможно я слишком усложняю работу с перечислениями, но примеров от InterSystems практически нет. У кого-нибудь получалось работать с перечислениями в Cache через .NET Gateway?
...
Рейтинг: 0 / 0
Использование System.Enum в .NET Gateway
    #37166381
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Turk ,

Дано:
1) Caché 2010.2.3
2)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
namespace Enum
{
  public class Class1
  {
    public enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 };

    public static int Add(int a, int b)
    {
      return a + b;
    }
    public static Colors Test1(Colors col, System.Net.Sockets.AddressFamily b)
    {
      return col + (int) b;
    }
    public static Colors Test2()
    {
      return Colors.Red;
    }
  }
}

При импорте сборки DLL в Caché генерируются помимо прочего классы-перечисления: System.Net.Sockets.AddressFamily, Enum.Class1.Colors
Для передачи перечисления достаточно передать строковое представление значения, например, для примера выше:

w ##class(Enum.Class1).Add(GW,1,2),!
w ##class(Enum.Class1).Test2(GW).getvalueuu(),!
w ##class(Enum.Class1).Test1(GW,##class(Enum.Class1.Colors).#Blue,##class(System.Net.Sockets.AddressFamily).#Banyan).getvalueuu(),!

Результат:
Код: plaintext
1.
2.
3.
TEST>do ^enum
3
1
25
...
Рейтинг: 0 / 0
Использование System.Enum в .NET Gateway
    #37167184
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servitw ##class(Enum.Class1).Test1(GW,##class(Enum.Class1.Colors).#Blue,##class(System.Net.Sockets.AddressFamily).#Banyan).getvalueuu(),!

На этой команде у меня возникает исключение (в своей сборке использовал область ClassLibrary1):
Код: plaintext
1.
2.
3.
4.
5.
6.
Error: ОШИБКА #5023: Ошибка Java Шлюза: Object of type 'System.String' cannot be converted to type 'ClassLibrary1.Class1+Colors'.
   at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
   at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture,Signature sig)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at InterSystems.Data.CacheClient.Gateway.Gateway.executeInstanceMethod(MethodInfo method, String methodName, String oref)
   at InterSystems.Data.CacheClient.Gateway.Gateway.executeMethod()

Похоже это ошибка более ранних версий (в частности, 2009.1.5). Перейти на 2010.х пока не можем из-за одного критичного изменения.
Посмотрим, что скажет InterSystems на WRC.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Использование System.Enum в .NET Gateway
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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