Как указать параметр метода как 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();
}
}