2010-02-16 26 views
2

這個問題是類似這樣的: Restrict method access to a specific class in C++創建受限制的方法/字段在C#

不過,我的問題是C#。

重申:我有兩個類,例如FooBar,它們緊密耦合。 Foo揭露我只想要Bar有權訪問的方法。

我還挺有我想要的東西的想法,但不知道如何真正做到這一點,或者知道一個簡單的方法存在。這將涉及使用某種依賴於使用(new StackFrame(1)).GetMethod().DeclaringType來拒絕訪問的屬性。用法會是這個樣子:

public class Foo { 

    [RestrictedUsage(Allow=typeof(Bar))] 
    public int SomeMethod() 
    { 
     // do something 
    } 

} 

可能有相關的細節我錯過了這個問題(我是新來的) - 我一定會爲我去更新它。

UPDATE: 我應該指出,Foo包裝現有UIElement誰的行爲,我想修改。由於課程是封閉的,很難正常修改。 Bar是將值轉換爲正確值的類。 Bar是非UI,在我的應用程序中用於其他地方。 Foo不知道如何轉換值(這很複雜 - 這就是Bar),這就是爲什麼我不能簡單地包裝基本方法。

喬恩斯基特給了我期待的答案 - 改變類的佈局(全拜是他至今),但我不認爲任何答案是適用的(好的答案只是不相關)。

我已經在代碼中所犯的錯誤,引用了錯誤的屬性...

回答

6

兩個選項:

  • 把Foo和酒吧在一個單獨的配件,並Foo的方法內部
  • 使Foo中的Bar成爲嵌套類,並使該方法私有化

後者通常是更實用的選擇,如果使Bar成爲嵌套類秒。

如果沒有這些工作,我想你最好只使用一個內部方法,並記錄它 - 多少你不信任的代碼的其餘部分在組裝?

+0

我不信任的代碼,因爲我不使用它的只有一個。由於Foo也是一個UIElement,所以在其他地方自然也提到它(排除單獨的程序集)。 – 2010-02-16 22:30:22

+0

不是唯一使用它的人不一定是不信任代碼的理由。你的同事是否經常忽略記載的「不要使用這種」類型的警告?另外,僅僅因爲Foo被別處引用並不意味着它不能在它自己的程序集中...... – 2010-02-16 23:13:44

+0

我最終嵌套了這個類。我稍微調整了一些其他部分,新的結果很好。謝謝! – 2010-02-19 01:57:37

0

通常情況下,我建議像下面這樣:

public abstract class Foo:UIElement{ 
    //... 
} 

public class Bar:UIElement{ 
    //... 
    private class FooImpl:Foo 
    { 
     public int SomeMethod() 
     { 
      // do something 
     } 
    } 
} 

但是,如果我們處理的UI元素,那麼我們可能還面臨着XAML?像這樣的類結構將使它很難在XAML實例化一個Foo/FooImpl,因爲你可能需要使用工廠模式...

相關問題