问题描述
以下代码可以正常使用
: 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是同一类型)。
screenshot of values of submodelElement and BasysEigenschaft
不幸的是,[Get]功能的分配在第二个代码片段中无效。我收到此错误
system.invalidCastException:“方法调用失败,因为无法使用以下参数调用'公共替代BaSyx.Models.Core.AssetAdministrationShell.Generics.SubmodelElementTypes.GetPropertyValueHandler(Of Double)的属性Get()”: 参数匹配参数'value'不能从'VB $ AnonymousDelegate_0(Of Object,Integer)'转换为'GetPropertyValueHandler(Of Double)'。”
任何帮助将不胜感激
解决方法
我与SubmodelElemenntTypes.Property -Class的创建者讨论了这个问题。 像Craig建议的那样,Activator.CreateInstance方法不会完全像新的T属性构造函数那样创建类型。以下几行解决了这些问题。
versionElement.querySelector('.htlgb').text
感谢克雷格的帮助!