如何隐藏intellisense中的公共方法

Jor*_*dan 49 .net c# reflection intellisense encapsulation

我想隐藏intellisense成员列表中的公共方法.我创建了一个属性,当应用于方法时,将导致在构造对象时调用该方法.我这样做是为了更好地支持部分课程.问题是在某些环境(例如Silverlight)中,反射无法访问私有成员,甚至是子类的私有成员.这是一个问题,因为所有工作都是在基类中完成的.我必须将这些方法设为公开,但我希望它们不受intellisense的影响,类似于Obsolete属性的工作原理.坦率地说,因为我是关于对象封装的肛门.我尝试了不同的东西,但实际上没有任何效果.该方法仍显示在成员下拉列表中.

当我不希望客户端调用公共方法时,如何防止公共方法出现在intellisense中?对于一个真正的问题,非利士人怎么样!这也适用于必须公开的MEF属性,但有时您希望将它们从客户端隐藏.

更新: 自从发布此问题以来,我已成熟为开发人员.为什么我如此关心隐藏界面是在我之外.

Adi*_*ter 114

EditorBrowsable像这样使用这个属性会导致一个方法不能在intellisense中显示:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public void MyMethod()
{
}
Run Code Online (Sandbox Code Playgroud)

  • @Jordan我刚才自己尝试了,当我引用库的dll时它没有显示方法.但是,它确实显示项目是否在同一个解决方案中并且我正在引用该项目. (15认同)
  • 是的,这是预期的行为.在编写代码时,它无意过滤*you*中的项目! (10认同)
  • 是的,我试过这个.它不起作用.该方法仍显示在成员列表中. (3认同)
  • 确实.为了更清晰的代码,我打破了OOP规则.我患有软件OCD或其他东西. (3认同)
  • 它曾经在 VB.Net 和较旧的 Visual Studio 版本中工作,但后来他们改变了它并合并了 C# 的不正确行为,如果项目在同一个解决方案中,它不再受到尊重。甚至没有选择行为的选项。:-( (2认同)

Sim*_*imY 15

你在找 EditorBrowsableAttribute

以下示例演示如何通过为EditorBrowsableAttribute属性设置适当的值来隐藏IntelliSense类的属性.在自己的程序集中构建Class1.

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

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;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您只是导入dll,则editorbrowsable只隐藏方法,而不是如果您在解决方案中引用另一个项目我认为 (27认同)

cad*_*ll0 -4

扩展我对部分方法的评论。尝试这样的事情

Foo.part1.cs

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

    partial void Initialize();
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)