首页 > 解决方案 > 动态生成的泛型类型无法正常工作

问题描述

以下代码可以正常工作:

 Dim SubmodelElement = New BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.[Property](Of Double)() With {
                .IdShort = "TestProperty1",
                .[Set] = Function(prop, val)
                             Return _test = val
                         End Function
        }
    SubmodelElement.[Get] = Function(prop)
                                Return 4711
                            End Function

我要做的是使用以下代码为我的类的每个属性动态创建这些子模型元素:

For Each Eigenschaft As PropertyInfo In Me.GetType().GetProperties()
            If Eigenschaft.CanRead = True Then
                Dim Eigenschaftstyp As Type = Type.GetType(Eigenschaft.PropertyType.FullName)

                Dim GenerischerTypBasysProperty As Type = GetType(BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.Property(Of)).MakeGenericType(Eigenschaftstyp)
                Dim BasysEigenschaft = Activator.CreateInstance(GenerischerTypBasysProperty)

                BasysEigenschaft.IdShort = Eigenschaft.Name
                BasysEigenschaft.[Get] = Function(prop)
                                             'Return Eigenschaft.GetValue(Me)
                                             Return 4711
                                         End Function
                BasysEigenschaft.Set = Sub(ByVal Prop, ByVal Wert)
                                           Eigenschaft.SetValue(Me, Wert)
                                       End Sub
                MyBase.SubmodelElements.Add(BasysEigenschaft)
            End If
        Next

正如在调试器中看到的那样,两个对象(SubmodelElement 和 BasysEigenschaft 属于同一类型)。

submodelElement 和 BasysEigenschaft 的值的屏幕截图

不幸的是,[Get] 函数的分配在第二个代码片段中不起作用。我收到这个错误

System.InvalidCastException:“方法调用失败,因为 'Public Overrides Property Get() As BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes.GetPropertyValueHandler(Of Double)' 无法使用这些参数调用:参数匹配参数 'value' 无法转换从 'VB$AnonymousDelegate_0(Of Object,Integer)' 到 'GetPropertyValueHandler(Of Double)'。

错误信息截图

任何帮助将不胜感激

标签: .netvb.netgenerics.net-corereflection

解决方案


我与 SubmodelElementTypes.Property -Class 的创建者讨论了这个问题。像 Craig 建议的 Activator.CreateInstance-method 不会创建与 new Property (of T) 构造函数完全相同的类型。以下几行解决了这些问题。

        For Each Eigenschaft As PropertyInfo In Me.GetType().GetProperties()

        If Eigenschaft.GetCustomAttributes(Of BasysPropertyAttribute).Count > 0 Then

            If Eigenschaft.CanRead = True Then


                If Eigenschaft.CanRead = True Then
                    Dim Eigenschaftstyp As Type = Type.GetType(Eigenschaft.PropertyType.FullName)

                    Dim BasysDataTypeXsd As DataType = DataType.GetDataTypeFromSystemType(Eigenschaftstyp)
                    Dim BasysEigenschaft As BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.Property = DirectCast(SubmodelElementFactory.CreateSubmodelElement(ModelType.Property, BasysDataTypeXsd), BaSyx.Models.Core.AssetAdministrationShell.Implementations.SubmodelElementTypes.Property)


                    BasysEigenschaft.IdShort = Eigenschaft.Name
                    BasysEigenschaft.[Get] = Function(BasysProperty As Object)
                                                 Return New ElementValue(Eigenschaft.GetValue(Me), BasysDataTypeXsd)
                                             End Function
                    BasysEigenschaft.[Set] = Sub(ByVal BasysProperty As Object, ByVal Wert As ElementValue)
                                                 Eigenschaft.SetValue(Me, CTypeDynamic(TypeDescriptor.GetConverter(Eigenschaftstyp).ConvertFromString(Nothing, Globalization.CultureInfo.InvariantCulture, Wert.Value), Type.GetType(Eigenschaft.PropertyType.FullName)))
                                             End Sub
                    MyBase.SubmodelElements.Add(BasysEigenschaft)

                End If


            End If

        End If

    Next

感谢克雷格的帮助!


推荐阅读