Если у вас есть модуль с java-библиотекой, не зависящей от Android, это должно работать: apply plugin:'java'
Поместите его в начало файла build.gradle, а затем перестройте.
apply plugin: 'java'
apply plugin: 'jacoco'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.11'
sourceCompatibility = 1.7
targetCompatibility = 1.7
}
Longhorn213 почти имеет правильный ответ, но как, поскольку говорят Sean Chambers и bdukes, необходимо использовать
ctrl is IInterfaceToFind
вместо
ctrl.GetType() == aTypeVariable
Причина, почему это, если Вы используете .GetType()
Вы получите истинный тип объекта, не обязательно, к чему он может также быть брошен в его цепочке реализации наследования/Интерфейса. Кроме того, .GetType()
никогда не будет возвращать абстрактный тип / интерфейс, так как Вы не можете новый абстрактный тип или интерфейс. GetType()
бетон возвратов вводит только.
Причина это не работает
if(ctrl is typeToFind)
То, потому что тип переменной typeToFind
на самом деле System.RuntimeType
, не тип Вы установили его значение к. Пример, если Вы устанавливаете значение строки к"foo
", его тип является все еще строкой нет"foo
". Я надеюсь, что это имеет смысл. Очень легко запутаться при работе с типами. Я хронически смущен при работе с ними.
Большая часть вещи импорта отметить об ответе longhorn213 состоит в том, что необходимо использовать рекурсию, или можно пропустить некоторые средства управления на странице.
Хотя у нас есть рабочее решение здесь, я также хотел бы видеть, существует ли более сжатый способ сделать это с LINQ.
Можно просто искать в Интерфейсе. Это также использует рекурсию, если управление имеет дочерние элементы управления, т.е. кнопка находится в панели.
private List<Control> FindControlsByType(ControlCollection controls, Type typeToFind)
{
List<Control> foundList = new List<Control>();
foreach (Control ctrl in this.Page.Controls)
{
if (ctrl.GetType() == typeToFind)
{
// Do whatever with interface
foundList.Add(ctrl);
}
// Check if the Control has Child Controls and use Recursion
// to keep checking them
if (ctrl.HasControls())
{
// Call Function to
List<Control> childList = FindControlsByType(ctrl.Controls, typeToFind);
foundList.AddRange(childList);
}
}
return foundList;
}
// Pass it this way
FindControlsByType(Page.Controls, typeof(IYourInterface));
Я внес бы следующие изменения в пример Longhorn213 для чистки этого немного:
private List<T> FindControlsByType<T>(ControlCollection controls )
{
List<T> foundList = new List<T>();
foreach (Control ctrl in this.Page.Controls)
{
if (ctrl as T != null )
{
// Do whatever with interface
foundList.Add(ctrl as T);
}
// Check if the Control has Child Controls and use Recursion
// to keep checking them
if (ctrl.HasControls())
{
// Call Function to
List<T> childList = FindControlsByType<T>( ctrl.Controls );
foundList.AddRange( childList );
}
}
return foundList;
}
// Pass it this way
FindControlsByType<IYourInterface>( Page.Controls );
Таким образом, Вы возвращаете список объектов желаемого типа, которые не требуют, чтобы другой бросок использовал. Я также внес необходимое изменение в "как" оператор, на который другие указали.
Был бы "быть" работой оператора?
if (myControl is ISomeInterface)
{
// do something
}
Интерфейсы достаточно близки к типам, которые это должно чувствовать о том же. Я использовал бы в качестве оператора.
foreach (Control c in this.Page.Controls) {
IMyButtonInterface myButton = c as IMyButtonInterface;
if (myButton != null) {
// do something
}
}
Можно также протестировать использование, оператор, в зависимости от потребности.
if (c is IMyButtonInterface) {
...
}
Если Вы собираетесь сделать некоторую работу над ним, если это имеет тот тип, то TryCast - то, что я использовал бы.
Dim c as IInterface = TryCast(obj, IInterface)
If c IsNot Nothing
'do work
End if
можно всегда просто использовать в литом виде:
c as IMyButtonInterface;
if (c != null)
{
// c is an IMyButtonInterface
}