在C#中创建受限制的方法/字段

时间:2010-02-16 07:46:52

标签: c#

这个问题类似于这个问题: Restrict method access to a specific class in C++

但是,我的问题是C#。

重申一下:我有两个课程,比如FooBar紧密耦合。 Foo公开了一种我只希望Bar可以访问的方法。

我有点想知道我想要什么,但不知道如何实际做到这一点,或者知道是否存在更简单的方法。它将涉及使用依赖于使用(new StackFrame(1)).GetMethod().DeclaringType拒绝访问的某种属性。用法看起来像这样:

public class Foo {

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

}

我可能缺少这个问题的相关细节(我是新来的) - 我一定会在我去的时候更新它。

更新 我应该提到Foo包裹了我试图修改的现有UIElement行为。由于课程是密封的,因此很难正常修改。 Bar是将值转换为正确值的类。 Bar是非UI,用于我的应用程序中的其他位置。 Foo不知道如何转换值(它很复杂 - 这就是Bar的用途),这就是为什么我不能只包装基本方法。

Jon Skeet给出了我期待的答案 - 改变课程的布局(感谢他们到目前为止)但我认为答案都不适用(好的答案只是不相关)。

我已经在代码中犯了错误,引用了错误的属性......

2 个答案:

答案 0 :(得分:6)

两个选项:

  • 将Foo和Bar放在一个单独的程序集中,并将Foo的方法设为内部
  • 使Bar成为Foo中的嵌套类,并使方法成为私有

后者通常是更实用的选择,如果使Bar成为嵌套类是合理的。

如果这些都不起作用,我认为你最好只使用内部方法并记录它 - 你对组装中的其余代码有多少不信任?

答案 1 :(得分:0)

通常我建议如下:

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

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

但如果我们处理UIElements,那么我们可能还在处理XAML?像这样的类结构会很难在XAML中实例化Foo / FooImpl,因为你可能需要使用工厂模式...