如何从IntelliSense中隐藏公共方法

70

我想要隐藏 IntelliSense 成员列表中的公共方法。我创建了一个属性,应用于方法时,构造对象时将调用该方法。我这样做是为了更好地支持部分类。问题在于,在某些环境中(如 Silverlight),反射不能访问私有成员,甚至那些子类的私有成员也无法访问。这是一个问题,因为所有工作都在基类中完成。我必须将这些方法设置为公共的,但我希望它们在 IntelliSense 中被隐藏,类似于 Obsolete 属性的工作方式。坦率地说,我对对象封装非常苛刻。我尝试了不同的方法,但什么都没起作用。该方法仍然显示在成员下拉列表中。

当我不希望客户端调用公共方法时,如何在 IntelliSense 中防止其显示? 对于一些文盲来说,这是一个真正的问题!这也适用于必须为 MEF 属性设置为 public 的情况,但有时您希望将其隐藏。

更新:自从我发布这个问题以来,作为开发人员,我的素质已经提高了。我为什么会这么关心隐藏接口还是个谜。


3
如果你不希望它们被访问或使用,请不要公开它们。 - Oded
2
显式接口实现可能是要考虑的另一种方法。这些方法不是类的公共API的一部分,而只能通过接口进行访问。 - Anthony Pegram
@AnthonyPegram,我尝试过这个,但结果出现了类似的反射访问问题。在某些情况下,似乎只有公共成员(甚至子类)才能被反射访问。 - Jordan
@Jordan 抱歉,我假设一个类有两个部分。如果你有多个部分,你可以使用私有事件来实现。 - cadrell0
3
@Jordan 我很幸运有同事在我过度工程化时拍我一下脑袋。 - cadrell0
显示剩余3条评论
3个回答

157

使用EditorBrowsable属性,可以使某个方法不显示在IntelliSense中:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public void MyMethod()
{
}

10
我尝试过了,不行。这个方法仍然显示在成员列表中。 - Jordan
23
@Jordan 我刚刚亲自尝试了一下,当我引用库的dll时,它并不显示方法。但是,如果项目在同一个解决方案中并且我正在引用该项目,则会显示。 - Adi Lester
13
是的,这是预期行为。它的目的不是在你编写代码时过滤掉你自己的项目! - Cody Gray
3
确实如此。为了使代码更加简洁,我违反了面向对象编程规则。我可能是因为软件强迫症而受苦。 - Jordan
3
以前在VB.Net和旧版Visual Studio中它可以正常工作,但后来他们做了改变并加入了C#的不正确行为,现在如果项目在同一个解决方案中,这种行为就不再被尊重。甚至没有选择这种行为的选项可供选择。 :-( - Christoph

22

你正在寻找 EditorBrowsableAttribute

以下示例演示了如何通过设置 EditorBrowsableAttribute 属性的适当值来隐藏类的属性,从而在 IntelliSense 中隐藏该属性。将 Class1 构建到自己的程序集中。

在 Visual Studio 中创建一个新的 Windows 应用程序解决方案,并添加对包含 Class1 的程序集的引用。在 Form1 构造函数中,声明 Class1 的一个实例,键入实例名称并按下句点键以激活 IntelliSense 下拉列表中的 Class1 成员。年龄属性不会出现在下拉列表中。

using System;
using System.ComponentModel;

namespace EditorBrowsableDemo
{
    public class Class1
    {
        public Class1()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        int ageval;

        [EditorBrowsable(EditorBrowsableState.Never)]
        public int Age
        {
            get { return ageval; }
            set
            {
                if (!ageval.Equals(value))
                {
                    ageval = value;
                }
            }
        }
    }
}

39
如果你只是导入dll,editorBrowsable仅会隐藏方法,但如果你在解决方案中引用另一个项目,则不会隐藏它。我认为。 - Isaac Bolinger
我正在尝试使用Visual Studio 2022这种方法,但似乎不再起作用了 :( - ilCosmico

-4

关于部分类方法的评论,我想进一步解释一下。请尝试如下代码:

Foo.part1.cs

partial class Foo
{
    public Foo()
    {
        Initialize();
    }

    partial void Initialize();
}

Foo.part2.cs

partial class Foo
{
    partial void Initialize()
    {
         InitializePart1();
         InitializePart2();
         InitializePart3();
    }

    private void InitializePart1()
    {
        //logic goes here
    }

    private void InitializePart2()
    {
        //logic goes here
    }

    private void InitializePart3()
    {
        //logic goes here
    }
}

这最终是我所做的。叹气 - Jordan
不完全准确。我只是在部分类中使用了私有方法,然后从主类调用它们。我有多个部分类,我有点疯了。需要帮助。叹气 - Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接