Нахождение средств управления, которые используют определенный интерфейс в ASP.NET

Если у вас есть модуль с 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
    }
7
задан chicks 6 September 2015 в 13:03
поделиться

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.

7
ответ дан 6 December 2019 в 10:55
поделиться

Можно просто искать в Интерфейсе. Это также использует рекурсию, если управление имеет дочерние элементы управления, т.е. кнопка находится в панели.

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));
5
ответ дан 6 December 2019 в 10:55
поделиться

Я внес бы следующие изменения в пример 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 );

Таким образом, Вы возвращаете список объектов желаемого типа, которые не требуют, чтобы другой бросок использовал. Я также внес необходимое изменение в "как" оператор, на который другие указали.

4
ответ дан 6 December 2019 в 10:55
поделиться

Был бы "быть" работой оператора?

if (myControl is ISomeInterface)
{
  // do something
}
1
ответ дан 6 December 2019 в 10:55
поделиться

Интерфейсы достаточно близки к типам, которые это должно чувствовать о том же. Я использовал бы в качестве оператора.

foreach (Control c in this.Page.Controls) {
    IMyButtonInterface myButton = c as IMyButtonInterface;
    if (myButton != null) {
        // do something
    }
}

Можно также протестировать использование, оператор, в зависимости от потребности.

if (c is IMyButtonInterface) {
    ...
}
1
ответ дан 6 December 2019 в 10:55
поделиться

Если Вы собираетесь сделать некоторую работу над ним, если это имеет тот тип, то TryCast - то, что я использовал бы.

Dim c as IInterface = TryCast(obj, IInterface)
If c IsNot Nothing
    'do work
End if
0
ответ дан 6 December 2019 в 10:55
поделиться

можно всегда просто использовать в литом виде:

c as IMyButtonInterface;

if (c != null)
{
   // c is an IMyButtonInterface
}
0
ответ дан 6 December 2019 в 10:55
поделиться
Другие вопросы по тегам:

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