Флаги с веб-сервисами

Обычно плохая практика иметь импорт внутри класса, но использование функций класса для этого будет выглядеть так:

class Deck:
    random = __import__('random')
    def __init__(self,choice,card = 0):
        self.choice = choice
        self.card = card
    def deck(self): 
        if self.choice == 1:
            print((self.random.randint(1,5)))

x = Deck(choice = 1)
x.deck()
6
задан Brawndo 4 February 2009 в 02:44
поделиться

4 ответа

Я провел обширное исследование на этом и нашел, что не возможно сериализировать константы перечисления через веб-сервис. Обратите внимание, что для выполнения цели Вам не нужны перечисления Ни один или Полный. Эти два перечисления могут подразумеваться с чтением / комбинация записи:

Вы могли принять полный доступ если Ваш AccessLevels = Read | Запись и ни один если Ваш AccessLevels = 0 [ничто]

Ваши перечисления были бы похожи на это:

[Serializable,Flags]
public enum AccessLevels
{
    Read = 1,
    Write = 2
}
3
ответ дан 17 December 2019 в 18:20
поделиться

Флаги должны быть кратными числами два, и в Вашем случае Ваши флаги (0,1,2,3). Попробуйте изменяют Ваше определение структуры к:

[Serializable,Flags]
public enum AccessLevels{    
None = 1,    
Read = 2,    
Write = 4,    
Full = Read | Write}

И посмотрите, работает ли это лучше.

(Я надеюсь, что не выставляю себя дураком, ее последнее, и я на пути к кровати..)

0
ответ дан 17 December 2019 в 18:20
поделиться

Одна опция состояла бы в том, чтобы обеспечить более подробный класс вместо перечисления, например.

[Serializable]
public class AccessPermission{
 public boolean None{get;set;}
 public boolean Read{get;set;}
 public boolean Write{get;set;}
 public boolean Full{get;set;}

 public AccessPermission(AccessLevels level){
  None = false;
  Read = false;
  Write = false;
  Full = false;

  switch(level){
  case AccessLevels.None:
   break;
  case AccessLevels.Read:
   Read = true;
   break;
  case AccessLevels.Write:
   Write = true;
   break;
  case AccessLevels.Full:
   Read = true;
   Write = true;
   Full = true;
   break;
  }
 }
} 

Другая опция, которую я вижу, предоставляет метод в том, что когда-либо язык они используют для успешного взаимодействия целого числа, которое Вы отправляете. Оператор флага означает, что c# делает побитовое маскирование, чтобы найти, отмечен ли отдельный флаг

0001 -> None
0010 -> Read
0100 -> Write
0110 -> Full

таким образом для проверки на любое разрешение необходимо видеть, установлен ли тот бит


public static boolean CanRead(int accessLevel){
 return (accessLevel | 2) > 0 // return true if read bit set, using bitwise or
}

public static boolean CanWrite(int accessLevel){
 return (accessLevel | 4) > 0 // return true of write bit set.
}

Обратите внимание, что это второе решение более хрупко при изменении определения accessLevels Вы, клиент будет тихо отсутствовать, ведут себя.

0
ответ дан 17 December 2019 в 18:20
поделиться

Я имел подобную проблему и обошел ее путем добавления другого веб-сервиса для возврата currect флаговых значений сначала.

Они затем стали значениями, которые я использовал в сравнивании.

Не могло бы быть самое чистое решение, но оно работает.

Править:

Мой исходный ответ предположил, что значения передаются через как отдельный веб-сервис, а не в перечислении.

Однако вводя по абсолютному адресу вокруг, кажется, что перечисление 0,1,2 отображаемый на 1,2,4 через веб-сервис (даже, что [Флаги] атрибут установлен) является типичной проблемой.

Решение, предложенное многими людьми, состоит в том, чтобы изменить исходное определение перечисления и запуститься от 1, а не 0.

0
ответ дан 17 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: