Как указать параметр метода как UserControl и Interface

У меня есть конструктор с параметром p1, который имеет следующие характеристики:

  • p1 должен наследоваться от UserControl
  • р1 должен реализовать интерфейс MyInterface

Пример:

public class ClassA: UserControl, MyInterface
{ ... }

У любого есть идея, как я могу определить метод.

Конструктор выглядит так:

public MyClass(UserControl uc) : base(uc)
{ 
   // access to MyInterface-Methods
}

Базовый класс (который является от стороннего dll) требует UserControl, мне нужен доступ к методам MyInterface.

Заранее спасибо, rhe1980

2 ответа

Решение

Вы делаете это, объявляя абстрактный базовый класс:

public abstract class BaseControl : UserControl, IMyInterface {}

И объявите ваш аргумент конструктора этого типа. Клиентский код теперь должен быть производным от BaseControl и реализовывать интерфейс.

Не уверен, что это будет хорошо работать в конструкторе WPF, я знаю, что он не будет работать в конструкторе Winforms, он должен иметь возможность создавать экземпляр базового класса. И не общая работа, по той же причине. В этом случае вы должны прибегнуть к проверке во время выполнения:

public MyClass(UserControl uc) : base(uc)
{ 
    if (uc as IMyInterface == null) {
        throw new ArgumentException("You must implement IMyInterface", "uc");
    }
    // etc..
}

После моего комментария мне приходит в голову только

public void MyMethod<T>(T param) where T : UserControl, MyInterface
{
     // do something here
}

[РЕДАКТИРОВАТЬ] ОК, пока что никто не нанес удар по нему, поэтому я постараюсь следовать. Кажется, у вас есть класс, полученный из некоторого базового класса, принимающего UserControl, Вот что вы можете попробовать:

public interface ITest
{
    void AwesomeInterface();
}

//As far as I could tell, this class is in some 3rd party DLL
public class TheBaseClass
{
    protected TheBaseClass(UserControl uc)
    {

    }
}

//Now this should work just fine
public class ClassB<T> : TheBaseClass where T : UserControl, ITest
{
    public ClassB(T param) : base(param)
    {
        param.AwesomeInterface();
    }
}
Другие вопросы по тегам