【问题标题】:Method with a parameter that accepts Different types of Enum values带有接受不同类型枚举值的参数的方法
【发布时间】:2018-04-05 20:16:14
【问题描述】:

我有一个接受枚举值作为参数的方法,this answer 是我的参考。但是我似乎无法让它工作。

枚举

Public Enum FieldTypes
    db_Alpha = 0
    db_Memo = 1
    db_Numeric = 2
End Enum

Public Enum SubTypes
    st_None = 0
    st_Phone = 35
    st_Percentage = 37
    st_Address = 63
    st_Link = 66
End Enum


方法

Public Sub Foo(Of T)(ByVal Param1 As String, ByVal EnumParam As T)
     Dim param As Type = GetType(T)
     If param.IsEnum Then
        Dim x = param.GetEnumValues()
     End If
     'Running some codes here
End Sub


主要

Public Sub Test()
    Foo("TestName",FieldTypes.db_Memo)
End Sub

我正在获取作为参数传递的 Enum 类型的所有值。 我想减少方法重载并在这里了解泛型。接受 C# 和 VB.net 建议。

  1. 如何获取传递的 Enum 项的值?
  2. 如何限制这一点,只接受两种类型的 Enum 写入?

【问题讨论】:

  • 1) 转换为整数 2) 你不能使用泛型。您可以创建 2 个重载方法。
  • 这个问题毫无意义。您从可能必须从System.Enum 派生的参数类型的泛型类型开始。这不是泛型类型的地方;将参数类型设为System.Enum,然后您就大大限制了可能性。但是,您通过将方法签名限制为仅两种枚举类型的请求来完成这个问题。所有这些都是为了避免为避免所有类型确定代码并为您提供强大智能支持的方法编写两个重载。
  • @TnTinMn 是通用但限制 2 个输入,感谢您对此的见解。不过我还在研究这个。

标签: c# vb.net generics


【解决方案1】:

由于Enum 始终是值类型,您可以将函数“Foo”限制为仅接受值类型。

Public Sub Foo(Of T As Structure)(ByVal Param1 As String, ByVal EnumParam As T)

您还可以将泛型函数限制为仅接受引用类型

Public Sub Test(Of T As Class)(ByVal param As T)

或只接受实现特定接口的类型

Public Sub Test(Of T As IDispose)(ByVal param As T)

您甚至可以连接这些条件

Public Sub Test(Of T As Class, IDispose, IEnumerable)(ByVal param As T)

在你的函数 "Foo" 中,你可以检查 T 的类型是否正确,如下所示:

If Not GetType(T).Equals(GetType(FieldTypes)) AndAlso _
   Not GetType(T).Equals(GetType(SubTypes)) Then
    Throw New Exception("Enum type not supported")
End If

要获取 "EnumParam" 的数值,您可以将其转换为 Integer 或您的枚举所基于的任何其他数值类型:

Dim x As Integer = Convert.ToInt32(EnumParam)

【讨论】:

  • 谢谢!我会修改这个解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多