我有一个自定义控件,它是文本框和按钮(搜索控件)的组合。其定义的一个属性用于标识其位置(无论是在主页面还是内容页面中,以便我们进行搜索设置) PageName 。最初这被声明为字符串属性:
public string PageName
{
set;
get;
}
但是因为我们遇到了一些区分大小写的问题。我们将其更改为枚举,以便用户不会输入任何随机内容以避免异常。所以现在改为:
public enum PageNameProperty { MasterPage , SearchResultsPage, MLIPage };
public PageNameProperty PageName
{
set;
get;
}
但现在我们得到的错误是:
找不到方法:'Void UI.SearchTextBox.set_PageName(System.String)'。
内部异常(1级)
注意:现在我无法强制用户将其更改为PageName.Master或其他任何内容,因为他们无法修改当前版本的代码但只能安装我们的控件,因此项目将引用新的DLL。
除了在当前版本之前将属性类型复制回字符串之外,我还需要一些解决方案。
请帮忙。
答案 0 :(得分:1)
您更改了属性的签名(例如返回类型)。调用代码将失败,因为他们找不到预期的签名。
您应保留原始属性,将其标记为已过时,并创建一个新属性:
[Obsolete("User PageName2")
public string PageName {
{
get { return PageName2.ToString(); }
set { PageName2 = (PageNameProperty )Enum.Parse(typeof(PageNameProperty), value);
}
public PageNameProperty PageName2 { set; get; }
这将保持与以前使用的兼容性,同时注意使用新的。
答案 1 :(得分:0)
你可以这样做吗?:
public enum PageNameProperty { MasterPage , SearchResultsPage, MLIPage };
private PageNameProperty pageName;
public PageNameProperty PageName
{
get
{
return pageName ?? PageNameProperty.MLIPage;
}
set
{
pageName = value;
}
}
答案 2 :(得分:0)
您可以简单地验证值以确保它们使用有效的字符串
private string _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;
}
}
在设计时,这会给客户一个错误,说明他们输入的值无效。