如何在C#中动态强制转换并返回属性

如何在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属性类似于(请记

我已经读过关于这个主题的文章,但找不到合适的解决方案

我正在处理一个下拉列表,它接受一个枚举并使用它来填充自己。我找到了一个VB.NET的。在移植过程中,我发现它使用DirectCast()在返回SelectedValue时设置类型

请参见此处的原始VB:

要点是,控件

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)
第二种方法之所以有效,是因为您不需要将值作为给定类型返回,只需要将值作为类型Enum返回,即使它是下面的实际枚举。

  • 仿制药
  • 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);