Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Поиск элементов управления, использующих определенный интерфейс в ASP.NET
Имея чертовски много времени с этим, хотя я чувствую, что упускаю что-то очевидное. У меня есть элемент управления, который наследует от System.Web.UI.WebControls.Button, а затем реализует интерфейс, который я настроил. Так что думай...
public class Button : System.Web.UI.WebControls.Button, IMyButtonInterface { ... }
В коде страницы я хотел бы найти все экземпляры этой кнопки из ASPX. Поскольку я действительно не знаю, каким будет тип , просто интерфейс , который он реализует, это все, что мне нужно делать при циклическом прохождении через дерево управления. Дело в том, что мне никогда не приходилось определять, использует ли объект интерфейс, а не просто тестирует его тип. Как я могу перебирать дерево управления и дергать все, что реализует IMyButtonInterface чистым способом (Linq было бы хорошо)?
Опять же, знаю, что это что-то очевидное, но только сейчас начал активно использовать интерфейсы, и я не могу сосредоточиться на результатах Google, чтобы понять это :)
Edit: GetType() возвращает фактический класс, но не возвращает интерфейс, поэтому я не могу проверить это (например, он вернет " MyNamespace.Button "вместо" IMyButtonInterface "). При попытке использовать " as " или " is " в рекурсивной функции параметр type даже не распознается внутри функции! Это довольно странно. Так
if(ctrl.GetType() == typeToFind) //ok
if(ctrl is typeToFind) //typeToFind isn't recognized! eh?
Определенно почесываю голову над этим.
Longhorn213 почти имеет правильный ответ, но, как говорят Шон Чамберс и 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 );
Таким образом, вы получите список объектов нужного типа, которые не требуют использования другого приведения. Я также внес необходимые изменения в оператор "as", на который указали другие.
Интерфейсы достаточно близки к типам, чтобы он чувствовал себя примерно так же. Я бы использовала его как оператора.
foreach (Control c in this.Page.Controls) {
IMyButtonInterface myButton = c as IMyButtonInterface;
if (myButton != null) {
// do something
}
}
Вы также можете протестировать с помощью оператора is, В зависимости от ваших потребностей.
if (c is IMyButtonInterface) {
...
}