如何在C#中动态强制转换并返回属性
我已经读过关于这个主题的文章,但找不到合适的解决方案 我正在处理一个下拉列表,它接受一个枚举并使用它来填充自己。我找到了一个VB.NET的。在移植过程中,我发现它使用DirectCast()在返回SelectedValue时设置类型 请参见此处的原始VB: 要点是,控件如何在C#中动态强制转换并返回属性,c#,casting,C#,Casting,我已经读过关于这个主题的文章,但找不到合适的解决方案 我正在处理一个下拉列表,它接受一个枚举并使用它来填充自己。我找到了一个VB.NET的。在移植过程中,我发现它使用DirectCast()在返回SelectedValue时设置类型 请参见此处的原始VB: 要点是,控件 Type _enumType; //gets set when the datasource is set and is the type of the specific enum SelectedValue属性类似于(请记
Type _enumType; //gets set when the datasource is set and is the type of the specific enum
SelectedValue
属性类似于(请记住,它不起作用):
现在,这涉及到一个核心点,我认为在其他讨论中没有涉及到这个核心点。在几乎每个例子中,人们都认为不需要DirectCast
,因为在每个例子中,他们都静态地定义了类型
这里不是这样。作为控件的程序员,我不知道它的类型。所以,我不能投。此外,下面的行示例不会编译,因为c#casting不接受变量。而VB的CType
和DirectCast
可以接受类型T作为函数参数:
return Enum.Parse(_enumType, RequestValue, true);
或
或
或
或
返回CastTo(Enum.Parse(_enumType,RequestValue,true));
那么,有什么解决办法吗?.NET 3.5解决此问题的最佳方法是什么?处理此问题的最佳.NET 2.0/3.5方法是使用泛型 处理它的最佳.NET2.0/3.5方法是使用泛型 您不需要转换为正确的类型。。。您只需要强制转换到枚举。毕竟,这是属性的声明类型:
return (Enum) Enum.Parse(_enumType, RequestValue, true);
(老实说,我不确定为什么
Enum.Parse
没有声明为返回Enum本身。它不可能是任何其他类型。)您不需要强制转换为正确的类型。。。您只需要强制转换到枚举。毕竟,这是属性的声明类型:
return (Enum) Enum.Parse(_enumType, RequestValue, true);
(老实说,我不确定为什么Enum.Parse
没有声明为返回Enum本身。它不可能是任何其他类型。)- 仿制药
- return(Enum)Enum.Parse(_enumType,RequestValue,true)李>
- 仿制药
- return(Enum)Enum.Parse(_enumType,RequestValue,true)李>
第二种方法之所以有效,是因为您不需要将值作为给定类型返回,只需要将值作为类型Enum返回,即使它下面是实际的枚举。我在上面睡了一觉,得出了相同的结论。谢谢这并不是完全正确的true@JadaVonRuth:没有更多的细节,这不是特别有用。什么是不正确的,什么是不正确的?例如,当您希望使用隐式运算符生成泛型caster属性(例如从db字符串到字符串中类型名称给定的各种枚举)时,仅使用enum实例将引发类型不允许的异常match@JadaVonRuth:因此,您不是说对
Enum
的强制转换将失败,而是说有时您需要特定的Enum类型。那很好,但这不是问题的目的。在被要求的情况下,我到底说了什么是“不完全正确的”?一旦我在上面睡了一觉,我就得出了同样的结论。谢谢这并不是完全正确的true@JadaVonRuth:没有更多的细节,这不是特别有用。什么是不正确的,什么是不正确的?例如,当您希望使用隐式运算符生成泛型caster属性(例如从db字符串到字符串中类型名称给定的各种枚举)时,仅使用enum实例将引发类型不允许的异常match@JadaVonRuth:因此,您不是说对Enum
的强制转换将失败,而是说有时您需要特定的Enum类型。那很好,但这不是问题的目的。在所要求的情况下,我到底说了什么“不完全正确”?
return (_enumType)Enum.Parse(_enumType, RequestValue, true) ;
return Convert.ChangeType(Enum.Parse(_enumType, RequestValue, true), _enumType);
return CastTo<_enumType>(Enum.Parse(_enumType, RequestValue, true));
return (Enum) Enum.Parse(_enumType, RequestValue, true);