获取错误'类型参数不能用作限定符'

时间:2016-07-09 16:28:10

标签: vb.net generics

我使用以下代码收到此错误。我肯定错过了什么。这是非常基本的东西。

Public Function GetSingleValue() As T
    If Items.Count = 0 Then Throw New Exception(T.CommonName & " can not be found")
    If Items.Count > 1 Then Throw New Exception("There are mulitple " & T.CommonName & " items found")
    Return Items(0)
End Function

Items()返回一个List(T)。 CommonName是T代表的类的成员

为什么我收到此错误?或者,vb.Net中是否有一个允许我这样做的构造。

4 个答案:

答案 0 :(得分:1)

  • 如果您知道T代表的课程,则无需在此处使用泛型。

  • 如果您不知道T代表的课程,那么没有什么可以阻止您的用户提供具有CommonName共享属性的课程。因此,编译器不能确保 CommonName属性存在,因此,不允许您这样做。请注意,由于shared (static in C#) properties are not inherited,需要一个共同的基类不会有所帮助。

答案 1 :(得分:1)

这听起来像你需要的而不是泛型是你的“~30个类”将实现的接口:

Public Interface Example
    Property CommonName As String
    ... other methods or properties
End Interface

然后在你的代码'Items'中返回一个List(Of Example)。

答案 2 :(得分:1)

您也可以将System.ComponentModel.DisplayNameAttribute应用于您的课程,以便为他们指定一个通用名称。

<DisplayName("Super Class")> _
Public Class MyClass
End Class

将此功能放在模块中

Public Function GetDisplayName(type As Type) As String
    Dim attributes = type.GetCustomAttributes(GetType(DisplayNameAttribute), False)

    If attributes.Length = 0 Then
        Return type.Name 'No DisplayNameAttribute, so use class name instead
    End If
    Return DirectCast(attributes(0), DisplayNameAttribute).DisplayName
End Function

并像这样使用

Public Function GetSingleValue() As T
    Dim commonName As String = GetDisplayName(GetType(T))
    If items.Count = 0 Then Throw New Exception($"{commonName} not found")
    If items.Count > 1 Then Throw New Exception($"Multiple {commonName} items found")
    Return items(0)
End Function

答案 3 :(得分:0)

Public Function GetSingleValue() As T
    Dim x as new T
    If Items.Count = 0 Then Throw New Exception(x.CommonName & " can not be found")
    If Items.Count > 1 Then Throw New Exception("There are multiple " & x.CommonName & " items found")
    Return Items(0)
End Function

Plutonix指出了我的错误。 CommonName不是共享属性,因此您需要一个实例。 我希望以某种方式共享CommonName,但这是一个不同的问题。 我也错了多次。