我使用以下代码收到此错误。我肯定错过了什么。这是非常基本的东西。
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中是否有一个允许我这样做的构造。
答案 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,但这是一个不同的问题。 我也错了多次。