我已经阅读过该主题的主题,但找不到合适的解决方案。
我正在开发一个带有枚举的下拉列表,并使用它来填充自己。我发现了一个VB.NET。在移植过程中,我发现它使用DirectCast()来设置返回SelectedValue的类型。
在这里查看原始的VB: http://jeffhandley.com/archive/2008/01/27/enum-list-dropdown-control.aspx
要点是,控件有
Type _enumType; //gets set when the datasource is set and is the type of the specific enum
SelectedValue
属性看起来像(记住,它不起作用):
public Enum SelectedValue //Shadows Property
{
get
{
// Get the value from the request to allow for disabled viewstate
string RequestValue = this.Page.Request.Params[this.UniqueID];
return Enum.Parse(_enumType, RequestValue, true) as _enumType;
}
set
{
base.SelectedValue = value.ToString();
}
}
现在这触及了我认为在其他讨论中错过的核心观点。在每个例子附近,人们认为不需要DirectCast
,因为在每个例子中,他们静态地定义了类型。
这不是这种情况。作为控件的程序员,我不知道类型。因此,我无法施展它。此外,以下线条示例将无法编译,因为c #casting不接受变量。 VB的CType
和DirectCast
可以接受Type T作为函数参数:
return Enum.Parse(_enumType, RequestValue, true);
或
return Enum.Parse(_enumType, RequestValue, true) as _enumType;
或
return (_enumType)Enum.Parse(_enumType, RequestValue, true) ;
或
return Convert.ChangeType(Enum.Parse(_enumType, RequestValue, true), _enumType);
或
return CastTo<_enumType>(Enum.Parse(_enumType, RequestValue, true));
那么,关于解决方案的任何想法?什么是.NET 3.5解决此问题的最佳方法?
答案 0 :(得分:4)
你不需要转换为正确的类型......你只需要转换为Enum。毕竟这是属性的声明类型:
return (Enum) Enum.Parse(_enumType, RequestValue, true);
(我不确定为什么Enum.Parse
没有被声明为返回Enum本身,说实话。它不像它可能是任何其他类型。)
答案 1 :(得分:1)
第二个工作的原因是因为您不需要将值作为给定类型返回,只需将值作为 Enum 类型返回,即使它是下面的实际枚举。
答案 2 :(得分:0)
最好的.NET 2.0 / 3.5处理方法是使用泛型。