Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DesignOnly属性不会在运行时隐藏属性_C#_Asp.net_Custom Controls - Fatal编程技术网

C# DesignOnly属性不会在运行时隐藏属性

C# DesignOnly属性不会在运行时隐藏属性,c#,asp.net,custom-controls,C#,Asp.net,Custom Controls,我正在使用公共属性构建一个自定义web控件,我只希望在设计时可用(即,使其在代码隐藏中不可用)。 DesignOnly属性承诺可以做到这一点,但是当我设置[DesignOnly(true)]时,它没有任何明显的效果: [Bindable(true)] [Category("Appearance")] [DefaultValue(null)] [Localizable(false)] [DesignOnly(true)] public string MyProp { get {

我正在使用公共属性构建一个自定义web控件,我只希望在设计时可用(即,使其在代码隐藏中不可用)。
DesignOnly
属性承诺可以做到这一点,但是当我设置
[DesignOnly(true)]
时,它没有任何明显的效果:

[Bindable(true)]
[Category("Appearance")]
[DefaultValue(null)]
[Localizable(false)]
[DesignOnly(true)]
public string MyProp
{
    get
    {
        return ViewState["MyProp"] as string;
    }


    set
    {
        ViewState["MyProp"] = value;
    }
}
属性仍然出现在IntelliSense后面的代码中。在代码隐藏中为其设置一个值会起作用。在这些方面,行为就像从未设置属性一样。我已经清理并重建了完整的解决方案。两次

我做错了吗?那么,你能告诉我做这件事的正确方法是什么吗

非常感谢

DesignOnly属性承诺做到这一点

其实没有,;当在代码中访问它时,它试图弄清楚它不可用;如果你撒谎(即声称某件东西只有在可用时才是设计的),那么你应该期望它行为不端。编译器知道什么是可用的,并且此仅设计属性未在C#规范中定义,因此添加此属性对编译器没有影响

尝试添加:

[EditorBrowsable(EditorBrowsableState.Never)]
代码编辑器(IDE)会查看它(但仅在使用单独的程序集时)-请注意,这不会阻止您使用它-它只是隐藏了它


我相信MSDN文本试图描述代码中实际存在的属性与假装存在的属性之间的区别;实际上,您可以做各种事情使假属性出现在设计器中,而正是这些假属性可能被标记为“仅设计”

谢谢!这很有启发性。因此,我推测,无法通过依赖于当前模式(设计/运行时)的方式来控制属性的实际可用性?您可以通过使用
[Browsable(false)]
等方法使大多数设计师无法使用代码属性;通过使用自定义属性模型,您可以创建真正的仅限设计器的属性,但这是一个高级主题,涉及到理解
TypeDescriptor
PropertyDescriptor
ICustomTypeDescriptor
TypeConverter
,等等,非常复杂。