Простой способ сделать это - сохранить логическое значение, когда щелчок вызывается с помощью executeClick. Пример
button2.setOnClickListener {
//The click here is performed by clicking on the button itself
buttonFunctionality();
}
button1.setOnClickListener {
//Button 2 click performed via Button 1
performedProgrammatically = true;
buttonFunctionality();
}
Перечислимые типы отличны, но Вы смущаетесь неявным броском, который находится в foreach.
Давайте перепишем Ваш цикл немного:
public static void Main()
{
List<Cars> cars = new List<Cars>();
List<Animals> animals = new List<Animals>();
cars.Add(Cars.Chevrolet);
cars.Add(Cars.Honda);
cars.Add(Cars.Toyota);
foreach (Cars value in cars)
{
// This time the cast is explicit.
Animals isItACar = (Animals) value;
Console.WriteLine(isItACar.ToString());
}
Console.ReadLine();
}
Теперь результат удивляет Вас? Надо надеяться, не, кроме возможно того, что можно бросить от одного перечисления до другого. Это - просто более явная версия того, что делает Ваш исходный код.
То, что существует бросок, неявный в каждом foreach
цикл (даже при том, что это обычно не) является битом, который большинство разработчиков нашло бы сбивающим с толку, я думаю.
От раздела 8.8.4 из спецификации C# 3.0:
Вышеупомянутые шаги, в случае успеха, однозначно производят тип C набора, тип E перечислителя и тип T элемента. foreach оператор формы
foreach (V v in x) embedded-statement
затем расширен до:
{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
... // Dispose e
}
}
Само преобразование перечисления покрыто разделом 6.2.2:
Явные преобразования перечисления:
Явное преобразование перечисления между двумя типами обрабатывается путем обработки любого участвующего перечислимого типа как базового типа того перечислимого типа и затем выполнения неявного или явного числового преобразования между получающимися типами. Например, учитывая перечислимый тип E с и базовый тип интервала, преобразование от E до байта обрабатывается как явное числовое преобразование (§6.2.1) от интервала до байта, и преобразование от байта до E обрабатывается как неявное числовое преобразование (§6.1.2) от байта до интервала.
Концептуально, Перечисление является значением со статическим контролем типов со строковым представлением и числом. Когда Вы звоните ToString()
на перечислении это возвратит строковое представление. Когда Вы звоните GetType()
на перечислении Вы получите статический перечисляемый тип. Если Вы бросаете перечисление к int
, Вы получите целочисленное значение для перечисления.
Перечисления, как предполагается, со строгим контролем типов, но существуют некоторые вещи, о которых необходимо знать, как то, что любое целое число может быть брошено к любому перечислению, даже если оно не будет иметь соответствующего объявления (в этом случае, то строковое представление совпадет с числом).
В CLR, перечисления (как bool
s) просто рассматриваются как int
s, но если Вы назвали GetType () или GetString () он называет версии, которые делают то, что было описано выше.
Можно также получить перечисление из определенного типа.
public enum Cats : byte { ... }
public enum Dogs : int { ... }