2012-06-04 105 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

相關問題