2012-06-04 103 views
0

我有一个构造白衣参数P1,其具有以下规格:如何指定方法参数的用户控件和接口

  • P1必须从用户控件继承
  • P1必须实现接口MyInterface的

实施例:

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

任何一个想法如何我可以定义甲基OD。

的构造是这样的:

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

的基类(这是从第三方DLL)需要一个用户控件,我需要访问MyInterface的方法。

由于提前, rhe1980

+3

什么涉及到我的脑子里只有一个通用的'公共无效的MyMethod (T PARAM)其中T:用户控件,MyInterface' –

+0

@Trust我:为什么不把这是一个答案? – Vlad

+0

虽然我可能,但这只是一个建议;)有人潜藏在这里可能有更好的想法。 –

回答

0

你做到这一点通过声明抽象基类:

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.. 
} 
2

我的意见后,随之而来的我的脑子里只有一个

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

[编辑] OK,没有人采取它刺在此期间,所以我会尽力遵循。看起来你有一个从某种基类中衍生出来的类,取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(); 
    } 
} 
+0

@ t m -i'm a d:谢谢你的回答。也是我唯一的想法,但是然后来电者必须知道确切的类型.. – rhe1980

+0

@ rhe1980我不明白你在这里的犹豫。 :)顺便说一句,我想不出任何其他解决方案的约束。我相当肯定,如果你没有任何其他的重载,编译器会在使用MyMethod(myControl)时自动推断参数的类型(如果我错了,请在这里纠正我) –

+0

@ rhe1980:do你的意思是参数类型或实际参数的类型? – Vlad

相关问题