繁体   English   中英

自定义控件属性为枚举

[英]Custom control property as enum

我有一个自定义控件,它是文本框和按钮(搜索控件)的组合。 定义的属性之一用于标识其位置(无论是在母版页还是在内容页中,以便我们进行搜索设置),即PageName 最初,它被声明为字符串属性,如下所示:

public string PageName
{
    set;
    get;
}

但是由于我们在区分大小写方面存在一些问题。 我们将其更改为枚举,以便用户不会输入任何随机的东西来避免出现异常。 因此,现在将其更改为:

public enum PageNameProperty { MasterPage , SearchResultsPage, MLIPage };

public PageNameProperty PageName
{
   set;
   get;
}

但是现在我们得到的错误为:

找不到方法:“无效的UI.SearchTextBox.set_PageName(System.String)”。
内部异常(1级)

注意:现在我不能强迫用户将其更改为PageName.Master或其他任何内容,因为他们不能修改当前版本的代码,而只能安装我们的控件,因此项目将引用新的DLL。

除了在当前版本之前将属性类型复制回字符串之外,我还需要一些解决方案。

请帮忙。

您更改了属性的签名(例如,返回类型)。 调用代码将失败,因为他们找不到所需的签名。

您应该保留原始属性,将其标记为过时,然后创建一个新属性,如下所示:

[Obsolete("User PageName2")
public string PageName {
{
 get { return PageName2.ToString(); }
set { PageName2 = (PageNameProperty )Enum.Parse(typeof(PageNameProperty), value);
}

public PageNameProperty PageName2 { set; get; }

这将与以前的使用保持兼容,同时鼓励使用新的使用。

你能做这样的事情吗:

public enum PageNameProperty { MasterPage , SearchResultsPage, MLIPage };  
private PageNameProperty pageName;

public PageNameProperty PageName 
{ 
   get
   {
       return pageName ?? PageNameProperty.MLIPage;
   }
   set
   {
       pageName = value;
   }
} 

您可以简单地验证值以确保它们使用有效的字符串

私有字符串_pageName = null;

public string PageName
{
    set 
    { 
        if (value == null)
           throw new NullReferenceException();
        if (!(new string[] { "master", "content" }.Contains(value.ToLower()))
           throw new InvalidOperationException();

        _pageName = value; 
    }
    get
    {
       return _pageName;
    }
}

在设计时,这会给客户一个错误,指出他们输入了无效的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM